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

ego6inou  于 2023-10-14  发布在  Java
关注(0)|答案(4)|浏览(85)

此问题已在此处有答案

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

z9smfwbn1#

问题不在于模运算符,而在于浮点数的性质。一个double不能保存5.55、3.14或2.41的精确值,所以你得到一个近似的答案。
为了更好地理解这一点,当你在纸上只有有限的空间来写的时候,试着把1/3的值写成小数。最后会得到类似0.33333的值,它是实际值的近似值。同样的情况也发生在5.55中,当你把它写成二进制时,它变成了101.10001100110011001100110011...,它在某个地方被截断,以适应双精度型的空间。

qnzebej0

qnzebej02#

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

jslywgbw3#

Java double可能存在精度问题。
你为什么不试试BigDecimal

wvmv3b1j

wvmv3b1j4#

原因是Java不像我们那样做数学。java使用的是二进制数(来自Horstmann的java书籍的第4章),所以对于计算机来说,435 = 4 * 10^2 + 3 * 10^1 + 5 * 10^0
它这样做是因为二进制数(1或0)更容易操作,因为计算机中的开关要么开要么关(1或0)。
这导致了偶尔的舍入问题。如果你想强制它四舍五入,那么做一些事情,比如使用十进制格式,或者如果你只是需要显示的值四舍五入,你可以使用String.format或printf

相关问题