我正在尝试确定在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 100.0019-(100.0019%.001)

返回100.0010

你的例子是:

select 123.456-(123.456%.001)

返回123.450

现在,如果你想去掉0结尾,只需对它进行强制转换:

select cast((123.456-(123.456%.001)) as decimal (18,2))

返回123.45

我知道这个问题非常古老,但没有人使用子字符串舍入。这是对很长的数字进行四舍五入的优势(SQL server中字符串的限制通常是8000个字符):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)

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

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

你的例子:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

返回123.45

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

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

我认为我们可以在Hackerrank中找到更简单的示例解决方案:

问题说明:查询北纬的最大值 (LAT_N)来自小于137.2345的STATION。截断你的答案 小数点后4位。

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

上面的解决方案告诉你如何简单地将值限制在4个小数点内。如果你想降低或提高小数后面的数字,只要把4改成你想要的任何数字。

你到底要不要小数点?

如果没有,请使用

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

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

select round(@value,2)