当没有符号的0相等且更常被接受为正确时,为什么Java在0前面打印一个负号?

时间:2013-12-27 16:46:55

标签: java

在java中,以下代码的输出为0.0,-0.0,-0.0. 这些不同答案的原因是什么?

System.out.print((0.0 % -1)+","+(-0.0 % 1)+","+ (-0.0 % -1));

4 个答案:

答案 0 :(得分:6)

模数运算符只需将除数后的余数除去。

将0除以-1得到0,结果为0。

浮点数和双精度确实知道-0和+ 0之间的区别,所以当你取-0的余数时你得到-0因为它仍然是0到1之间的有效数字(或-1)

这是浮点数工作方式的一个怪癖,以及0的特殊属性,因为其他数字不适用:

System.out.println((0.0 % -1)+","+(-0.0 % 1)+","+ (-0.0 % -1));

System.out.println((0 % -1)+","+(-0 % 1)+","+ (-0 % -1));

System.out.println((3 % -1)+","+(-3 % 1)+","+ (-3 % -1));

显示器:

0.0,-0.0,-0.0 
0,0,0 
0,0,0

由于要求提及:

浮点数在IEEE_754-1985中定义:

http://en.wikipedia.org/wiki/IEEE_754-1985

有一个完整的维基百科页面讨论负零点:

http://en.wikipedia.org/wiki/Negative_zero

这也至少部分解释了为什么模数的作用如下:

  

根据IEEE 754标准,负零和正零应与通常(数字)比较运算符相比,如C和Java的==运算符。

由于modulo产生一个数字> = 0和<比给定值,-0已满足> =要求(因为-0 == 0),操作可以立即结束。

答案 1 :(得分:1)

因为IEEE float具有正零和负零值。

答案 2 :(得分:0)

因为float支持negative zero。改变符号会导致信息丢失,但信息可能无意义。

所以基本上它解决了显示问题,而不是数据表示;如果您想要“正确”的再现,请为您的输出提供格式化字符串。这适用于您不喜欢默认情况的任何情况 ToString()代表。

答案 3 :(得分:0)

原因是IEEE-754 signed zero规则。具体来说,因为浮点数不是“无限”精确的,它“简化”处理复数。