在java中,以下代码的输出为0.0,-0.0,-0.0.
这些不同答案的原因是什么?
System.out.print((0.0 % -1)+","+(-0.0 % 1)+","+ (-0.0 % -1));
答案 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规则。具体来说,因为浮点数不是“无限”精确的,它“简化”处理复数。