Java模块运算符

时间:2013-02-22 18:48:36

标签: java floating-point modulo

为什么此代码打印 2.4099999999999997 ,而不仅仅是2.41

public class Main
{
    public static void main(String args[])
    {
        double d = 5.55%3.14;
        System.out.println(d);
    }
}

4 个答案:

答案 0 :(得分:3)

问题不在于模运算符,而在于浮点数的性质。双倍不能保持5.55,3.14或2.41的精确值,所以你得到一个近似的答案。

为了更好地理解这一点,当你在纸上只有有限的空间来写它时,尝试将1/3的值写为小数。你最终会得到像0.33333这样的东西,它是实际值的近似值。当你用二进制文件写它时,5.55也会发生同样的情况 - 它会变成101.10001100110011001100110011...,它会在某处被切断以适应双精度空间。

答案 1 :(得分:2)

import java.text.DecimalFormat;

double d = 5.55%3.14;       
DecimalFormat df = new DecimalFormat("#.##");
System.out.println( df.format( d ));

添加DecimalFormat

编辑:

你也可以

    double d = 5.55%3.14;
    System.out.printf("%1$.2f", d);

答案 2 :(得分:1)

Java double可能存在精度问题。

为什么不试试BigDecimal

答案 3 :(得分:1)

原因是java不像我们那样做数学。 java使用二进制数字(从Horstmann的大型java书的第4章开始)到计算机,435 = 4 * 10 ^ 2 + 3 * 10 ^ 1 + 5 * 10 ^ 0

这样做是因为二进制数字(1或0)更容易操作,因为计算机中的开关是打开或关闭(1或0)。

这导致了偶然的舍入问题。如果你想强制它循环,然后做一些事情,比如使用十进制格式,或者你只需​​要四舍五入的值,你可以使用String.format或printf