0

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

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

4 回答 4

3

问题不在于模运算符,而在于浮点数的性质。双精度数不能保持 5.55、3.14 或 2.41 的精确值,因此您得到一个近似值。

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

于 2013-02-22T19:00:24.037 回答
2
import java.text.DecimalFormat;

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

添加十进制格式

编辑:

你也可以

    double d = 5.55%3.14;
    System.out.printf("%1$.2f", d);
于 2013-02-22T18:54:28.333 回答
1

Java double 可能存在精度问题。

你为什么不试试BigDecimal

于 2013-02-22T18:49:57.293 回答
1

原因是java不像我们那样做数学。java使用二进制数(来自Horstmann's big java book的第4章)所以对于计算机,435 = 4 * 10^2 + 3 * 10^1 + 5 * 10^0

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

这会导致偶尔的舍入问题。如果你想强制它舍入,然后使用十进制格式,或者如果你只需要舍入显示的值,你可以使用 String.format 或 printf

于 2013-02-22T19:04:48.040 回答