为什么原始浮点值可以是-0.0?这是什么意思?
我可以取消该功能吗?
当我有:
float fl;
然后fl == -0.0
返回true
,fl == 0
也是如此。但是当我打印它时,会打印-0.0
。
答案 0 :(得分:53)
因为Java使用定义-0.0
的{{3}}以及何时应该使用它。
可表示的最小数字在次正规有效数中没有1位,并且由符号确定为正或负零。它实际上表示在0和相同符号的最小可表示的非零数字之间的范围内的数字的舍入为零,这就是为什么它有一个符号,以及为什么它的倒数+ Inf或 - Inf也有一个标志。
您可以添加0.0
e.g。
Double.toString(value + 0.0);
请参阅:IEEE Standard for Floating-Point Arithmetic (IEEE 754)
涉及负零的操作
...
(-0.0)+ 0.0 - > 0.0
-
“ - 0.0”是在浮点运算导致负浮点数接近0时产生的, it 无法正常表示。
答案 1 :(得分:17)
原始浮点值如何变为-0.0?
浮点数使用IEEE 754 standard存储在内存中,这意味着可能存在舍入错误。您可能永远无法使用有限资源存储无限精度的浮点数。
你永远不应该测试一个浮点数==到其他一些,即永远不会写这样的代码:
if (a == b)
其中a
和b
是浮点数。由于舍入错误,这两个数字可能会在内存中存储为不同的值。
您应该定义要使用的精度:
private final static double EPSILON = 0.00001;
然后根据您需要的精度进行测试
if (Math.abs(a - b) < epsilon)
因此,在您的情况下,如果您想以给定的精度测试浮点数等于零:
if (Math.abs(a) < epsilon)
如果您想在GUI中输出数字时格式化数字,可以查看following article和NumberFormat类。
答案 2 :(得分:9)
Java中的浮点类型在JLS中描述:4.2.3 Floating-Point Types, Formats, and Values。
它讨论了这些特殊的价值观:
(...)四个值集中的每一个不仅包括上面赋予它的有限非零值,还包括NaN值和四个值正零,负零,正无穷大,负无穷大。 (...)
并且有一些关于它们的重要说明:
正零和负零比较相等;因此,表达式0.0 == - 0.0的结果为真,并且0.0> -0.0的结果为假。但其他操作可以区分正负零;例如,1.0 / 0.0的值为正无穷大,而1.0 / -0.0的值为负无穷大。
你无法“取消”该功能,这是花车如何工作的一部分。
有关负零的更多信息,请查看Signed zero维基百科条目。
如果你想检查一下你所拥有的“种类”,你可以使用以下这样的事实:
(new Float(0.0)).equals(new Float(-0.0))
是false
(但确实是0.0 == -0.0
)。
在这里查看更多内容:Java Floating-Point Number Intricacies。
答案 3 :(得分:4)
用于浮点运算的IEEE 754标准(目前由...使用) 大多数支持浮点的计算机和编程语言 数字)需要+0和-0。零可以被认为是 扩展实数行的变体,使得1 / -0 =-∞和1 / + 0 = +∞,除零仅为±0 /±0和±∞/±∞时未定义。
我认为您不能或不需要取消该功能。由于精度错误,您不能将浮点数与==进行比较。
答案 4 :(得分:3)
关于如何在java /计算机中管理浮点数的好文章。 http://www.artima.com/underthehood/floating.html
顺便说一下:当2.0 - 1.0产生不等于1.0的0.999999999999时,计算机真的很痛苦。在javascript表单验证中,这可能特别容易被发现。