SQL Server:使用数字文字计算

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.

  • 是否有一些关于SQL Server如何评估数字文字的文档?
  • 这些文字的数据类型是什么?
  • 我是否真的必须投射它们以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的数值.