【问题标题】:Getting rid of negative zero value for float摆脱浮点的负零值
【发布时间】:2015-04-19 23:26:22
【问题描述】:

使用 SQL Server 2008R2 将“相同”数字四舍五入为十进制或浮点数时,我得到一个符号差异。

显示差异的示例代码:

    DECLARE @f float = -0.00001;
    DECLARE @d decimal = -0.00001;
    PRINT CONVERT(varchar,ROUND(@f, 4))  --- outputs -0
    PRINT CONVERT(varchar,ROUND(@d, 4))  --- outputs 0

我需要将浮点值四舍五入为 0,而不是 -0。

我认为它归结为 IEEE 754 规范,它定义了两个零表示(正和负),而小数只有一个零。我认为浮动上的相等运算符可以处理这个问题,但出于兼容性原因,我必须比较两个浮动 AS 字符串。

是否有摆脱负零的功能/选项(至少在转换为字符串时)?

【问题讨论】:

  • 一个丑陋但有效的解决方案是:CONVERT(varchar,CASE WHEN ROUND(@f, 4) = -0 THEN 0 ELSE ROUND(@f, 4) END)
  • PRINT abs(CONVERT(varchar,ROUND(@f, 4)))
  • @RahulTripathi - 这也会将-4 转换为+4
  • @MartinSmith:- 是的,我说的是 0。
  • 如果添加 0.0 会发生什么?如果你有 IEEE 数学,你应该得到(正)0。

标签: sql-server floating-point ieee-754


【解决方案1】:

将 0.0 添加到该值可以解决此问题。感谢 tmyblebu 的回答。

     PRINT CONVERT(varchar,ROUND(@f + 0.0, 4))

【讨论】:

    【解决方案2】:

    @Pascal 试试下面的代码。如果它对你有帮助,请告诉我。

    DECLARE @f float = -0.00001;
        DECLARE @d decimal = -0.00001;
        PRINT abs(ROUND(@f, 4))  --- outputs 0
        PRINT abs(ROUND(@f, 4))   --- outputs 0
    

    【讨论】:

    • 此代码将为 -4.0 和 4.0 输出相同的值。我只想摆脱负零。
    猜你喜欢
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2020-12-04
    相关资源
    最近更新 更多