【问题标题】:Rounding off incorrectly in SQL在 SQL 中不正确地四舍五入
【发布时间】:2021-05-10 09:59:08
【问题描述】:

因此,当我将小数点后的第一位数字设为 4 或 5 或 8 时,我会得到一个不正确的舍入值作为输出(如下面的“案例 1”所示)。但是当我在同一个地方使用其他数字(1,2,3,5,6,9,0)时,我得到了预期的结果(如下面的“案例 2”所示)。谁能解释为什么会这样?

--CASE 1
DECLARE @factor float = 0.425,
        @amount money = 1
SELECT CONVERT(money, ROUND(@factor * @amount, 2))
--output is 0.42 (should be 0.43)

--CASE 2
SET @factor = 0.625  
SELECT CONVERT(money, ROUND(@factor * @amount, 2))
--output is 0.63 (correct)

请注意,通过使用另一个变量来存储产品 - '@factor * @amount' 然后使用该变量来获取舍入值,可以解决此问题。但我只是好奇为什么我以前会看到这种差异。 提前致谢。

【问题讨论】:

  • 第一个案例的输出是0.42,而不是你说的0.425(检查,因为那会是一个更令人惊讶的结果)
  • 请尝试在 dbfiddle 之类的东西上重现您的问题,因为目前,似乎对我来说一切正常(也许你已经简化了问题,并在这样做的过程中消除了问题的原因?) db<>fiddle example
  • @Damien_The_Unbeliever- 抱歉,打错了。我已经编辑过了。谢谢

标签: sql sql-server rounding


【解决方案1】:

嗯,这些价值正处于边缘。 0.425 和 0.625 会向上取整,而例如 0.42499999999999 和 0.62499999999999 会向下取整。

您正在使用FLOAT,这不是一种精确的数据类型,而是一种近似的数据类型。因此,您只能期待大概的结果。

如果您想要精确的结果,请使用精确的类型,例如 DECIMAL

文档:https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-ver15

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2013-09-07
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多