【问题标题】:SQL Server Automatic Rounding?SQL Server 自动舍入?
【发布时间】:2009-06-13 03:41:46
【问题描述】:

我对以下结果感到非常困惑:

PRINT 3.1415926535897931 /180

控制台结果 = 0.01745329251994329500

DECLARE @whatTheHell float(53)
SET @whatTheHell  = 3.1415926535897931/180
PRINT @whatTheHell 

控制台结果 = 0.0174533

我不明白,因为指的是这个:

http://msdn.microsoft.com/en-us/library/ms131092.aspx

Sql Server Float 应该等同于 c# double。 但是当我在 c# 中计算它时:

double hellYeah = 3.1415926535897931 /180;

我得到 0.017453292519943295...

【问题讨论】:

  • 不错的变量名。 +1

标签: sql sql-server rounding


【解决方案1】:

我认为您对PRINT 使用STR 函数的默认设置隐式地将数字转换为字符的事实感到困惑——长度为10(请参阅MSDN)。试试PRINT STR(@wth, 20, 16),你可能会更开心。

【讨论】:

  • 更可能是“数据类型优先级”和常量评估等
【解决方案2】:

除法不是四舍五入。 PRINT 是四舍五入。

DECLARE
  @var1 float,
  @var2 float,
  @var3 float

SET @var1 = 3.1415926535897931
SET @var2 = 180

SET @var3 = @var1 / @var2
SELECT @var1/@var2 as Computed, @var3 as FromVariable

PRINT @var1/@var2
PRINT @var3

【讨论】:

    【解决方案3】:

    我猜“FLOAT”类型只是对精度有限制。 Books Online 说使用 FLOAT(53) 您应该获得高达 15 位的精度 - 不确定这些数字是在小数点分隔符之前还是之后是否存在固有限制。

    尝试使用十进制:

    DECLARE @whatTheHell2 decimal(18,16)
    SET @whatTheHell2  = 3.1415926535897931/180
    PRINT @whatTheHell2 
    

    给我结果:

    0.0174532925199433
    

    马克

    【讨论】:

    • 但是当您阅读此 msdn 文档时:msdn.microsoft.com/en-us/library/ms131092.aspx 您会看到 sql 浮点精度等同于 c# 双精度。或者当我用 c# 计算这个时: double pipo = 3.1415926535897931 /180;我得到:0.017453292519943295 ???
    • 我知道 - 这也是我困惑的地方 - 请参阅其他答案以获取更多信息。似乎 SQL 服务器为 FLOAT 假定某种默认精度 - 使用 NUMERIC 或 DECIMAL 代替显式精度设置
    【解决方案4】:

    来自 SQL Server 2005 联机丛书Data Type Conversion 主题:

    在 Transact-SQL 语句中,常量 带小数点是自动 转换为数值数据值, 使用最小精度和比例 必要的。例如,常数 12.345 转换为精度为 5 和 3.

    所以下面的内容更能代表 SQL Server 隐式所做的事情:

    DECLARE @whatTheHell NUMERIC(21, 20)
    SET @whatTheHell = 3.1415926535897931 / 180
    PRINT @whatTheHell
    

    【讨论】:

    • 参考这个msdn.microsoft.com/en-us/library/ms173773.aspx,float(53) 应该有15位的精度。就像 c# double 一样:c# 结果确实有 15 位。所以我真的不明白为什么我最终会得到一个浮点数(53)的6位精度......
    【解决方案5】:

    PRINT 3.1415926535897931 /180 被评估为十进制。

    浮点数只能解析为 15 位有效数字。你有 17 所以它不能浮动。由于datatype precedence 和输出比例和精度is based on these rules,180 通过隐式转换变为十进制

    输出 0.01745329251994329500 也有 17 个无花果。必须是小数。

    现在,SET @whatTheHell = 3.1415926535897931/180。浮点转换作为赋值运算符的一部分进行。在此之前,它也是右手边的小数。浮点数是近似值,并且是四舍五入。

    在 c# 中都是双打,因为你没有 fixed 点(除非你告诉编译器?)

    相关问题:

    Choosing the appropriate precision for decimal(x,y)

    In SQL how can I convert a money datatype to a decimal?

    SQL Server, where clauses comparisons with different types & default casting behaviour

    【讨论】:

      【解决方案6】:

      当您说 SQL 浮点映射到 C# 双精度时,我认为您假设 SQL 浮点字节大小与 C# 双字节大小相同。

      我会说 C# double 是唯一一个足够大的浮点数据类型,在 C# 中,可以存储 SQL 浮点数。

      例子:

      C# 双精度 = 8 字节 Sql 浮点数 = 4 个字节

      解决问题的简单方法是在 SQL 中使用小数或数字

      【讨论】:

      猜你喜欢
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多