这两个舍入表达式的值是否不同?

时间:2017-05-19 18:31:30

标签: sql sql-server rounding

SELECT
ROUND(152.7300, 2, 1), --returns 152.7300
ROUND('152.7300', 2, 1) --returns 152.72

为什么第二个舍入表达式导致向下舍入到.72?

我认为它与VARCHAR输入转换为numeric有关,但我无法想象它会如何导致它丢失decimal值那样的。

2 个答案:

答案 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。