Java 模运算符产生不精确的结果[重复]

问题描述 投票:0回答:4

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

public class Main
{
    public static void main(String args[])
    {
        double d = 5.55%3.14;
        System.out.println(d);
    }
}
java floating-point modulo
4个回答
3
投票

问题不在于模运算符,而在于浮点数的本质。双精度数无法保存 5.55、3.14 或 2.41 的精确值,因此您会得到一个近似答案。

为了更好地理解这一点,当纸上的空间有限时,尝试将 1/3 的值写成小数。您最终会得到类似

0.33333
的值,这是实际值的近似值。当您以二进制形式编写 5.55 时,也会发生同样的情况 - 它会变成
101.10001100110011001100110011...
,它会在某处被截断以适应双精度数的空间。


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);

1
投票

Java double 可能存在精度问题。

你为什么不尝试一下

BigDecimal


1
投票

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

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

这会偶尔导致舍入问题。如果你想强制它四舍五入,那么可以使用小数格式,或者如果你只需要四舍五入显示的值,你可以使用 String.format 或 printf

© www.soinside.com 2019 - 2024. All rights reserved.