我试图确定截断或删除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()
函数并将其转换回十进制。还有其他方法吗?
Answers:
select round(123.456, 2, 1)
ROUND ( 123.456 , 2 , 1 )
当第三个参数!= 0时,它会截断而不是舍入
http://msdn.microsoft.com/zh-CN/library/ms175003(SQL.90).aspx
句法
ROUND ( numeric_expression , length [ ,function ] )
争论
numeric_expression
是精确数字或近似数字数据类型类别的表达式,位数据类型除外。
length
将numeric_expression舍入的精度。length必须是tinyint,smallint或int类型的表达式。当length为正数时,numeric_expression将舍入为length指定的小数位数。当length为负数时,numeric_expression在小数点的左侧舍入,如length所指定。
function
是要执行的操作的类型。函数必须是tinyint,smallint或int。如果省略函数或值为0(默认值),则将数字表达式四舍五入。当指定非0的值时,numeric_expression被截断。另一个截断没有舍入解决方案和示例。
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
Floor()
是删除小数而不舍入的方法。太糟糕的Floor()没有第二个参数来指示在哪个位置。但是我认为* 10)/ 10确实可以很好地解决此问题。
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;
小数点后将为您提供2个值。(MS SQL服务器)
另一种方法是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。
请尝试使用此代码将一个点后的3个十进制值转换为2个小数位:
declare @val decimal (8, 2)
select @val = 123.456
select @val = @val
select @val
输出为123.46
我认为,使用Hackerrank中提供的更简单的示例解决方案可以使工作变得更加轻松:
问题陈述:从STATION查询北纬最大值(LAT_N)小于137.2345。将答案截断到小数点后4位。
SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;
上面的解决方案让您知道如何简单地将值限制为4个小数点。如果要在小数点后降低或升高数字,只需将4更改为所需的值即可。