【问题标题】:Value of a table column is not what it seems表列的值不是看起来的那样
【发布时间】:2020-08-22 18:05:30
【问题描述】:

我正在尝试查找数量小于 1 的表中的所有记录。 为此,我使用了一个简单的查询:

SELECT * FROM Table WHERE Quantity < 1

但是,我得到的结果是实际数量为 1。 由于某些奇怪的原因,此列的类型是 FLOAT(不要问为什么,我还没有创建它)

我怎么知道该列的确切值是多少。我试过了:

SELECT 
  CEILING(quantity) as [Ceiling quantity], 
  FLOOR(quantity) as [Floor quantity], 
  CAST(ROUND(Quantity, 2) AS INT) as [Rounded quantity], 
  Quantity AS [Actual quantity] 
FROM Table

但结果是:

Ceiling quantity       Floor quantity         Rounded quantity Actual quantity
---------------------- ---------------------- ---------------- ----------------------
1                      0                      1                1

我知道从技术上讲,数量 小于 1。我正在尝试找到一种体面的方法来获取此列所包含的实际值。

【问题讨论】:

  • 了解floats——然后不要使用它们。请改用numeric/decimal。该值不是“1”。类似于0.99999999999999997。
  • 我知道值不是 1,但我想知道确切的值是多少。就像我说的,我没有创建表,我当然可以更改它,但这不是重点。
  • 可以将“精确值”作为该值所包含的位 (CONVERT(BINARY(8), quantity)) 或通过 FORMAT (FORMAT(quantity, 'G17')) 以过高的精度进行检查,但请注意后者使用 .NET 格式化例程,并且在解析为 T-SQL 文字时不一定往返。
  • 精确值为0x3FF0000000000000。
  • 关闭@jarlh 它是:0x3FEFFFFFFFFFFFFF

标签: sql ssms sql-server-2016


【解决方案1】:

感谢@JeroenMostert 提供正确答案:

SELECT 
  FORMAT(quantity, 'G17') as [Format quantity]
FROM Table

结果:

Format quantity
-------------------
0.99999999999999989

【讨论】:

    【解决方案2】:

    CONVERT 方法的风格保证每个不同的浮点值都转换为不同的字符串。这是第 3 种样式,可在 SQL Server 2016 及更高版本中使用。您可以在此处阅读有关 CONVERT 方法和不同样式的更多信息:

    https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

    你可以这样试试:

    SELECT Convert (VARCHAR(99), Quantity, 3) FROM Table
    

    【讨论】:

    • 这导致 9.9999999999999989e-001
    • 是的,这是 0.99999999999999989 的科学记数法。该符号的解释在这里:en.wikipedia.org/wiki/Scientific_notation
    • 其实可以准确地说这是SQL Server的科学记数法思想。我没有见过其他系统用三个固定数字格式化指数。令人讨厌的是,这是 SQL Server 在格式化 JSON 中浮点类型值时坚持使用的格式,即使该值完全可以表示为整数。 JSON 支持和这种CONVERT 样式首次出现在 SQL Server 2016 中可能并非巧合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    相关资源
    最近更新 更多