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

declare @value decimal(18,2)

set @value = 123.456

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


当前回答

我知道这有点晚了,但我不认为这是一个答案,我已经使用这个技巧很多年了。

只需从值中减去0.005并使用Round(@num,2)。

你的例子:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

返回123.45

它会自动调整四舍五入到您正在寻找的正确值。

顺便问一下,你是在重现电影《办公空间》里的程序吗?

其他回答

你到底要不要小数点?

如果没有,请使用

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

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

select round(@value,2)

实际上,不管第三个参数是0或1或2,它不会四舍五入你的值。

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))

我知道这有点晚了,但我不认为这是一个答案,我已经使用这个技巧很多年了。

只需从值中减去0.005并使用Round(@num,2)。

你的例子:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

返回123.45

它会自动调整四舍五入到您正在寻找的正确值。

顺便问一下,你是在重现电影《办公空间》里的程序吗?

SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

小数点后会有两个值。(mssql server)

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