我正在尝试确定在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时,它截断而不是舍入。
语法
ROUND ( numeric_expression , length [ ,function ] )
参数
numeric_expression Is an expression of the exact numeric or approximate numeric data type category, except for the bit data type. length Is the precision to which numeric_expression is to be rounded. length must be an expression of type tinyint, smallint, or int. When length is a positive number, numeric_expression is rounded to the number of decimal positions specified by length. When length is a negative number, numeric_expression is rounded on the left side of the decimal point, as specified by length. function Is the type of operation to perform. function must be tinyint, smallint, or int. When function is omitted or has a value of 0 (default), numeric_expression is rounded. When a value other than 0 is specified, numeric_expression is truncated.
其他回答
你到底要不要小数点?
如果没有,请使用
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。
以下是我能够截断而不是舍入的方法:
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
ROUND ( 123.456 , 2 , 1 )
当第三个参数!= 0时,它截断而不是舍入。
语法
ROUND ( numeric_expression , length [ ,function ] )
参数
numeric_expression Is an expression of the exact numeric or approximate numeric data type category, except for the bit data type. length Is the precision to which numeric_expression is to be rounded. length must be an expression of type tinyint, smallint, or int. When length is a positive number, numeric_expression is rounded to the number of decimal positions specified by length. When length is a negative number, numeric_expression is rounded on the left side of the decimal point, as specified by length. function Is the type of operation to perform. function must be tinyint, smallint, or int. When function is omitted or has a value of 0 (default), numeric_expression is rounded. When a value other than 0 is specified, numeric_expression is truncated.
对(x,1)取余是最简单的方法。