我用浮点计算做了一些测试,以尽量减少精度损失。我偶然发现了一个现象,我想在这里展示并希望得到解释。
当我写作时
print 1.0 / (1.0 / 60.0)
结果是
60.0024000960
当我编写相同的公式并进行显式转换时float
print cast(1.0 as float) / (cast(1.0 as float) / cast(60.0 as float))
结果是
60
到目前为止,我认为带有小数位的数字文字会自动被视为float
具有适当精度的值。投射到real
显示与投射到相同的结果float
.
- 是否有一些关于 SQL Server 如何计算数字文字的文档?
- 这些文字是什么数据类型?
- 我真的必须把他们投给
float
获得更好的精度(这对我来说听起来很讽刺:)?
- 有没有比用强制转换弄乱我的公式更简单的方法?
SQL Server 使用尽可能小的数据类型。
当你运行这个脚本时
SELECT SQL_VARIANT_PROPERTY(1.0, 'BaseType')
SELECT SQL_VARIANT_PROPERTY(1.0, 'Precision')
SELECT SQL_VARIANT_PROPERTY(1.0, 'Scale')
SELECT SQL_VARIANT_PROPERTY(1.0, 'TotalBytes')
您将看到 SQL Server 隐式使用了 NUMERIC(2, 1) 数据类型。
除以 60.0 将结果转换为 NUMERIC(8, 6)。
最终计算将结果转换为 NUMERIC(17, 10)。
Edit
摘自 SQL Server 在线书籍数据类型转换 http://msdn.microsoft.com/en-us/library/ms191530(SQL.90).aspx#_decimal
在 Transact-SQL 语句中,常量
自动带有小数点
转换为数值数据值,
使用最小精度和小数位数
必要的。例如,常数
12.345 转换为精度为 5 的数值
规模为3。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)