我用浮点计算做了一些测试,以最小化精度损失.我偶然发现我想在这里展示的一个现象,希望得到一个解释.
当我写
print 1.0 / (1.0 / 60.0)
结果是
60.0024000960
当我写相同的公式并做明确的转换为浮动
print cast(1.0 as float) / (cast(1.0 as float) / cast(60.0 as float))
结果是
60
到目前为止,我认为具有小数位的数字文字会被自动处理为具有适当精度的浮点值.铸造到真实显示与铸造浮动相同的结果.
>有没有关于sql Server如何评估数字文字的文档?
>哪些数据类型是这些文字?
>我真的要把它们漂浮得更好的精度(对我来说听起来好像是讽刺的)?
>有没有比使用演员混合我的公式更容易的方法?
解决方法
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).
编辑
取自sql Server联机丛书Data Type Conversion
In Transact-sql statements,a constant with a decimal point is automatically converted into a numeric data value,using the minimum precision and scale necessary. For example,the constant 12.345 is converted into a numeric value with a precision of 5 and a scale of 3.