此问题已在此处有答案:
Rounding Errors?(9个回答)
10年前关闭。
为什么这段代码打印出来的是2.4099999999997,而不是2.41?
public class Main
{
public static void main(String args[])
{
double d = 5.55%3.14;
System.out.println(d);
}
}
此问题已在此处有答案:
Rounding Errors?(9个回答)
10年前关闭。
为什么这段代码打印出来的是2.4099999999997,而不是2.41?
public class Main
{
public static void main(String args[])
{
double d = 5.55%3.14;
System.out.println(d);
}
}
4条答案
按热度按时间z9smfwbn1#
问题不在于模运算符,而在于浮点数的性质。一个double不能保存5.55、3.14或2.41的精确值,所以你得到一个近似的答案。
为了更好地理解这一点,当你在纸上只有有限的空间来写的时候,试着把1/3的值写成小数。最后会得到类似
0.33333
的值,它是实际值的近似值。同样的情况也发生在5.55中,当你把它写成二进制时,它变成了101.10001100110011001100110011...
,它在某个地方被截断,以适应双精度型的空间。qnzebej02#
添加DecimalFormat
编辑:
您还可以
jslywgbw3#
Java double可能存在精度问题。
你为什么不试试
BigDecimal
?wvmv3b1j4#
原因是Java不像我们那样做数学。java使用的是二进制数(来自Horstmann的java书籍的第4章),所以对于计算机来说,435 = 4 * 10^2 + 3 * 10^1 + 5 * 10^0
它这样做是因为二进制数(1或0)更容易操作,因为计算机中的开关要么开要么关(1或0)。
这导致了偶尔的舍入问题。如果你想强制它四舍五入,那么做一些事情,比如使用十进制格式,或者如果你只是需要显示的值四舍五入,你可以使用String.format或printf