【问题标题】:SQL Server datatype precision - Neo, what is real?SQL Server 数据类型精度 - Neo,什么是真实的?
【发布时间】:2010-01-13 13:48:01
【问题描述】:

SQL 服务器 2000 documentation:

是浮点数数据 以下有效值:–3.40E + 38 到 -1.18E - 38、0 和 1.18E - 38 到 3.40E + 38。存储大小为 4字节。在 SQL Server 中,同义词 实际上是 float(24)。

SQL Server 2005 documentation:

real 的 ISO 同义词是 float(24)。

编辑: 鉴于我正在阅读的内容,它说精度是 7,但我可以在我的数据库(SQL Server 2005)中输入最大为 9 的内容,见下文,类似地说明here 问题号。 7.

示例:0.180000082

真实的真正精度是多少,是否有配置选项(即:兼容模式)会影响精度?

【问题讨论】:

    标签: sql-server types precision


    【解决方案1】:

    您的答案在您链接的同一页面上:

    对于 FLOAT 数据类型,n 是用于以科学计数法存储尾数的位数

    24 位尾数(大约)为您提供 7 个 十进制 位精度(因为 2^24 ~= 10^7)。

    编辑添加:

    请注意,每个人都在说“大约”——这是有原因的 :)

    二进制浮点数和十进制文字不一定以直观的方式一起使用。对于背景阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic。另请注意,说“precision 的大约 7 个十进制数字”与能够存储超过 7 个有效数字的值并不矛盾!但是,这确实意味着此数据类型将无法区分 0.180000082 和 0.180000083,例如,因为它实际上并未存储两者的 精确 值:

    declare @f1 real
    declare @f2 real
    
    set @f1 = 0.180000082
    set @f2 = 0.180000083
    
    select @f1, @f2
    
    select @f1 - @f2
    

    ------------- -------------
    0.1800001     0.1800001
    
    (1 row(s) affected)
    
    
    -------------
    0
    
    (1 row(s) affected)
    

    事实上,realfloat(24) 相同,后者是一个带有 24 位尾数的二进制浮点数,我不相信有办法改变这一点。如果您想存储精确的十进制数量,浮点类型通常不是一个好的选择。

    【讨论】:

    • 感谢您的解释,这让我发疯了!
    • 很好的答案,并为该经典论文的链接 +2
    【解决方案2】:

    您将二进制(以 2 为底)精度与十进制(以 10 为底)精度混淆了。 24 位给你大约 7 个十进制数字。

    【讨论】:

      【解决方案3】:

      SQL Server 使用 4 字节或 8 字节来存储非十进制浮点数。

      如果您指定实数或浮点 到浮点 范围内的任何值,SQL Server 会在内部使用浮点。如果你使用 float 或 float 到 float (极限)范围内的任何东西,它会使用 float,也就是所谓的双精度。

      SQL Server 2005 中 float 的 MSDN 文档在这里:float and real (Transact-SQL)

      如果您有特定的精度需求,请改用十进制,它提供可配置的精度和小数位数:decimal and numeric (Transact-SQL)

      【讨论】:

        猜你喜欢
        • 2010-09-12
        • 1970-01-01
        • 2014-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-06
        • 2011-08-08
        相关资源
        最近更新 更多