原始浮点值如何为-0.0? 这意味着什么?
一个原始的浮动值如何可以是-0.0? 这意味着什么?
我可以取消该function吗?
当我有:
float fl;
然后fl == -0.0
返回true
,那么fl == 0
。 但是,当我打印它,它打印-0.0
。
因为Java使用IEEE标准的浮点运算(IEEE 754) ,它定义了-0.0
以及何时应该使用它。
可表示的最小数在低于正常的有效数中没有1位,并且由符号确定为正或负零 。 它实际上表示在零和相同符号的最小可表示的非零数之间的范围内舍入到零的数字 ,这就是为什么它具有符号,以及为什么它的相互+ Inf或-Inf也具有符号。
您可以通过添加0.0
来解决您的特定问题
例如
Double.toString(value + 0.0);
请参阅: Java浮点数错综复杂
涉及负零的操作
…
(-0.0)+ 0.0 – > 0.0
–
当浮点运算产生一个非常接近0的负浮点数时,会产生“-0.0”,而这个浮点数不能正常表示。
一个原始的浮动值如何可以是-0.0?
使用IEEE 754标准将浮点数存储在内存中,这意味着可能存在舍入误差。 您永远无法使用有限的资源来存储无限精度的浮点数。
你永远不应该testing一个浮点数==到其他的,也就是说永远不会写这样的代码:
if (a == b)
其中a
和b
是浮动的。 由于舍入错误,这两个数字可能会作为不同的值存储在内存中。
你应该定义一个你想要使用的精度:
private final static double EPSILON = 0.00001;
然后根据您需要的精度进行testing
if (Math.abs(a - b) < epsilon)
所以在你的情况下,如果你想testing的浮点数等于零在给定的精度:
if (Math.abs(a) < epsilon)
如果要在GUI中输出数字时格式化数字,可以查看下面的文章和NumberFormat类。
Java中的浮点types在JLS中描述: 4.2.3浮点types,格式和值 。
它谈到了这些特殊的价值:
(…)四个值集中的每一个不仅包括上面归结的有限非零值,还包括NaN值和四个值正零,负零 ,正无穷和负无穷。 (……)
并有一些关于他们的重要说明:
正零和负零比较相等; 因此expression式0.0 == – 0.0的结果是正确的,0.0> -0.0的结果是错误的。 但是其他的操作可以区分正负的零; 例如,1.0 / 0.0的值为正无穷大,而1.0 / -0.0的值为负无穷大。
您不能“取消”该function,这是浮动工作的一部分。
有关负零的更多信息,请查看已签名的零维基百科条目。
如果你想检查你有什么样的“种类”,你可以使用以下事实:
(new Float(0.0)).equals(new Float(-0.0))
是false
(但的确, 0.0 == -0.0
)。
在这里看看更多的这个: Java浮点数字错综复杂 。
从维基百科
浮点运算的IEEE 754标准(目前被大多数计算机和支持浮点数的编程语言所使用)都需要+0和-0。 可以认为零点是扩展实数线的变体,使得1 / -0 =-∞和1 / + 0 = +∞,除以零仅仅是对于±0 /±0和±∞/±∞ 。
我不认为你可以或需要取消该function。 无论如何,由于精度错误,您不能将浮点数与==进行比较。
关于如何在Java /计算机中pipe理浮点数的一篇很好的文章。 http://www.artima.com/underthehood/floating.html
顺便说一句:这是真正的痛苦,当计算机2.0 – 1.0可以产生0.999999999999不等于1.0 :)。 这可能是特别容易在javascriptformsvalidation偶然发现。