我正在尝试确定在SQL中截断或删除额外的小数位而不舍入的最佳方法。例如:

declare @value decimal(18,2)

set @value = 123.456

这将自动将@value舍入为123.46,这在大多数情况下都很好。然而,对于这个项目,我不需要那样。有没有一种简单的方法来截断我不需要的小数?我知道我可以使用left()函数并将其转换回小数。还有别的办法吗?


当前回答

如果你想要取一些像89.0904987这样的数字,并通过省略不需要的小数位将其转换为89.09,只需使用以下方法:

select cast(yourColumnName as decimal(18,2))

下面的截图来自W3Schools SQL数据类型部分,它描述了decimal(18,2)的作用:

因此,

select cast(89.0904987 as decimal(18,2))

给你:89.09

其他回答

你到底要不要小数点?

如果没有,请使用

select ceiling(@value),floor(@value)

如果你用0做,那么做一轮:

select round(@value,2)

另一种方法是ODBC的TRUNCATE函数:

DECLARE @value DECIMAL(18,3) =123.456;

SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result

现场演示

输出:

╔═════════╦═════════╗
║   val   ║ result  ║
╠═════════╬═════════╣
║ 123,456 ║ 123,450 ║
╚═════════╩═════════╝

备注:

我建议使用内置的ROUND函数,第3个参数设置为1。

另一个没有舍入解决方案的截断和示例。

    Convert 71.950005666 to a single decimal place number (71.9)
    1) 71.950005666 * 10.0 = 719.50005666
    2) Floor(719.50005666) = 719.0
    3) 719.0 / 10.0 = 71.9

    select Floor(71.950005666 * 10.0) / 10.0

如果你想要取一些像89.0904987这样的数字,并通过省略不需要的小数位将其转换为89.09,只需使用以下方法:

select cast(yourColumnName as decimal(18,2))

下面的截图来自W3Schools SQL数据类型部分,它描述了decimal(18,2)的作用:

因此,

select cast(89.0904987 as decimal(18,2))

给你:89.09

ROUND(number, decimals, operation)

number =>必选参数。要四舍五入的数字 decimals =>必选。要四舍五入的小数位数 operation =>可选。如果是0,则将结果四舍五入为小数。如果其他值大于0,则将结果截断为小数的个数。默认值为0

SELECT ROUND(235.415, 2, 1)

给你235.410

SELECT ROUND(235.415, 0, 1)

给你23.5万

但是现在你可以使用cast

SELECT CAST(ROUND(235.415, 0, 1) AS INT)

会得到235