【发布时间】: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