SELECT
ROUND(152.7300, 2, 1), --returns 152.7300
ROUND('152.7300', 2, 1) --returns 152.72
为什么第二个舍入表达式导致向下舍入到.72?
我认为它与VARCHAR
输入转换为numeric
有关,但我无法想象它会如何导致它丢失decimal
值那样的。
答案 0 :(得分:5)
将字符串文字传递给ROUND
时,SQL Server会将其转换为float
* 。相比之下,152.7300
is treated as numeric
:
在Transact-SQL语句中,带有小数点的常量会自动转换为数值数据值,使用所需的最小精度和小数。
float
的精确152.73
表示形式为152.72999572753906
,因此截断 ** 到第二个十进制数字会产生152.72
。
* 您可以通过传递非数字字符串来检查,例如ROUND('foo', 2, 1)
。这将产生“将数据类型varchar
转换为float
时出错。”
** 为ROUND
的第三个参数传递非零值表示截断数字,而不是舍入。
答案 1 :(得分:0)
https://docs.microsoft.com/en-us/sql/t-sql/functions/round-transact-sql
ROUND(numeric_expression,length [,function])
功能 是要执行的操作类型。 function必须是tinyint,smallint或int。省略function或者值为0(默认值)时,numeric_expression将四舍五入。如果指定了0以外的值,则会截断numeric_expression。