VVS*_*VVS 10 floating-point precision sql-server-2005
我做了一些浮点计算测试,以最大限度地减少精度损失.我偶然发现了一个我要在这里展示的现象,并希望得到一个解释.
当我写作
print 1.0 / (1.0 / 60.0)
Run Code Online (Sandbox Code Playgroud)
结果是
60.0024000960
Run Code Online (Sandbox Code Playgroud)
当我写相同的公式并进行显式转换时 float
print cast(1.0 as float) / (cast(1.0 as float) / cast(60.0 as float))
Run Code Online (Sandbox Code Playgroud)
结果是
60
Run Code Online (Sandbox Code Playgroud)
到目前为止,我认为带小数位的数字文字会自动被视为float具有适当精度的值.转换为real显示与转换相同的结果float.
float获得更好的精度(这对我来说听起来很讽刺:)?Lie*_*ers 10
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')
Run Code Online (Sandbox Code Playgroud)
您将看到SQL Server隐式使用NUMERIC(2,1)数据类型.
除以60.0将结果转换为NUMERIC(8,6).
最终计算将结果转换为NUMERIC(17,10).
编辑
取自SQL Server联机丛书数据类型转换
在Transact-SQL语句中,具有小数点的常量将使用所需的最小精度和小数位自动转换为数字数据值.例如,常量12.345将转换为精度为5且比例为3的数值.