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

Sql 这两个舍入表达式的值是否不同?,sql,sql-server,rounding,Sql,Sql Server,Rounding,为什么第二个舍入表达式会导致向下舍入到.72 我想这与将VARCHAR输入转换为数值有关,但我无法想象这会如何导致它丢失一个类似的十进制值。当您将字符串文本传递给圆形时,SQL Server会将其转换为浮点*。相比之下: 在Transact-SQL语句中,带小数点的常量将自动转换为数字数据值,并使用所需的最小精度和小数位数 152.73的精确float表示为152.72999572753906,因此将**截断为第二位小数产生152.72 *您可以通过传递一个非数字字符串来检查这一点,例如ROUN

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


我想这与将
VARCHAR
输入转换为
数值有关,但我无法想象这会如何导致它丢失一个类似的
十进制值。

当您将字符串文本传递给
圆形
时,SQL Server会将其转换为
浮点
*。相比之下:

在Transact-SQL语句中,带小数点的常量将自动转换为数字数据值,并使用所需的最小精度和小数位数

152.73
的精确
float
表示为
152.72999572753906
,因此将**截断为第二位小数产生
152.72

*您可以通过传递一个非数字字符串来检查这一点,例如
ROUND('foo',2,1)
。这将产生“将数据类型
varchar
转换为
float
时出错”

**为
舍入的第三个参数传递一个非零的值表示截断数字,而不是舍入。

圆形(数值_表达式,长度[,函数])

作用
要执行的操作类型。函数必须是tinyint、smallint或int。当忽略函数或函数值为0(默认值)时,数值_表达式将四舍五入。当指定的值不是0时,数值表达式将被截断。

您的意思是第二轮
表达式中的
152.72
?@CrazyCuNumber-是,谢谢。我更新了问题以反映正确的返回值152.72。也可以通过在长度中添加数字进行测试,如
SELECT ROUND(152.7300,6,1),ROUND('152.7300',6,1)
非常好的答案。非常感谢。以下两个查询的结果很好地说明了这一行为,乍一看,人们可能希望返回超过小数点的相同值,但由于浮点转换的原因,这两个查询不会返回相同的值
SELECT ROUND('152.7300',2,1)--返回152.72
SELECT ROUND('102.7300',2,1)--返回102.73
这只是部分回答了问题。函数参数不是字符串值被隐式转换为float然后被截断的原因。但它确实描述了为什么舍入是截断而不是舍入。我想OP可能已经知道了这一点,并且想知道为什么它没有被截断到152.73。是的,Dasblinkenlight的答案比我从ms文档中懒洋洋地剪切和粘贴要好得多。
SELECT
ROUND(152.7300, 2, 1), --returns 152.7300
ROUND('152.7300', 2, 1) --returns 152.72