我正在尝试确定在不四舍五入的情况下截断或删除 SQL 中多余小数位的最佳方法。例如:
declare @value decimal(18,2)
set @value = 123.456
这将自动舍@value
入为123.46
,这在大多数情况下都很好。但是,对于这个项目,我不需要那个。有没有一种简单的方法来截断我不需要的小数?我知道我可以使用该left()
函数并将其转换回小数。还有其他方法吗?
我正在尝试确定在不四舍五入的情况下截断或删除 SQL 中多余小数位的最佳方法。例如:
declare @value decimal(18,2)
set @value = 123.456
这将自动舍@value
入为123.46
,这在大多数情况下都很好。但是,对于这个项目,我不需要那个。有没有一种简单的方法来截断我不需要的小数?我知道我可以使用该left()
函数并将其转换回小数。还有其他方法吗?
ROUND ( 123.456 , 2 , 1 )
当第三个参数!= 0它截断而不是四舍五入
http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
句法
ROUND ( numeric_expression , length [ ,function ] )
论据
numeric_expression
是精确数值或近似数值数据类型类别的表达式,位数据类型除外。
length
是 numeric_expression 要四舍五入的精度。length 必须是 tinyint、smallint 或 int 类型的表达式。当length 为正数时,numeric_expression 被四舍五入为length 指定的小数位数。当长度为负数时,numeric_expression 在小数点左侧四舍五入,由长度指定。
function
是要执行的操作类型。函数必须是 tinyint、smallint 或 int。当 function 被省略或值为 0(默认)时,numeric_expression 被舍入。当指定 0 以外的值时,numeric_expression 将被截断。select round(123.456, 2, 1)
SELECT Cast(Round(123.456,2,1) as decimal(18,2))
这是我能够截断而不是舍入的方式:
select 100.0019-(100.0019%.001)
返回 100.0010
你的例子:
select 123.456-(123.456%.001)
返回 123.450
现在,如果您想摆脱结尾的零,只需将其转换为:
select cast((123.456-(123.456%.001)) as decimal (18,2))
返回 123.45
实际上,无论第三个参数是 0 或 1 还是 2,它都不会四舍五入您的值。
CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
你想要小数还是不想要?
如果没有,请使用
select ceiling(@value),floor(@value)
如果你用 0 做,那么做一轮:
select round(@value,2)
Round 有一个可选参数
Select round(123.456, 2, 1) will = 123.45
Select round(123.456, 2, 0) will = 123.46
另一个没有舍入解决方案和示例的截断。
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
这将删除任何数字的小数部分
SELECT ROUND(@val,0,1)
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;
会给你小数点后的 2 个值。(MS SQL 服务器)
ROUND(number, decimals, operation)
数字 => 必需。要四舍五入的
小数 => 必填。四舍五入运算的小数位数
=>可选。如果为 0,则将结果四舍五入到小数位数。如果另一个值不是 0,它会将结果截断为小数位数。默认值为 0
SELECT ROUND(235.415, 2, 1)
会给你235.410
SELECT ROUND(235.415, 0, 1)
会给你235.000
但现在修剪0
你可以使用cast
SELECT CAST(ROUND(235.415, 0, 1) AS INT)
会给你235
另一种方式是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
我建议使用将第三个参数设置为 1的内置函数。
我知道这已经很晚了,但我不认为这是一个答案,并且多年来一直在使用这个技巧。
只需从您的值中减去 0.005 并使用 Round(@num,2)。
你的例子:
declare @num decimal(9,5) = 123.456
select round(@num-.005,2)
返回 123.45
它会自动将舍入调整为您正在寻找的正确值。
顺便问一下,您是从电影《办公空间》中重新创建程序吗?
试试这样:
SELECT cast(round(123.456,2,1) as decimal(18,2))
请尝试使用此代码将点后的 3 个十进制值转换为 2 个小数位:
declare @val decimal (8, 2)
select @val = 123.456
select @val = @val
select @val
输出为 123.46
我认为您只需要十进制值,在这种情况下您可以使用以下内容:
declare @val decimal (8, 3)
SET @val = 123.456
SELECT @val - ROUND(@val,0,1)
我知道这个问题真的很老,但没有人使用子字符串来四舍五入。这是对非常长的数字进行舍入的优势(SQL Server 中的字符串限制通常为 8000 个字符):
SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
我认为通过在 Hackerrank 中找到的更简单的示例解决方案,我们可以更轻松:
问题陈述:从STATION查询北纬(LAT_N)小于137.2345的最大值。将您的答案截断到小数点后 4 位。
SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;
上面的解决方案让您了解如何简单地将值限制为 4 个小数点。如果您想降低或提高小数点后的数字,只需将 4 更改为您想要的任何值。
如果您希望通过简单地省略不需要的小数位来获取某个数字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
Mod(x,1)
是我认为最简单的方法。
select convert(int,@value)