为什么此代码打印2.4099999999999997,而不仅仅是 2.41
public class Main
{
public static void main(String args[])
{
double d = 5.55%3.14;
System.out.println(d);
}
}
为什么此代码打印2.4099999999999997,而不仅仅是 2.41
public class Main
{
public static void main(String args[])
{
double d = 5.55%3.14;
System.out.println(d);
}
}
问题不在于模运算符,而在于浮点数的性质。双精度数不能保持 5.55、3.14 或 2.41 的精确值,因此您得到一个近似值。
为了更好地理解这一点,当你在纸上只有有限的空间来写它时,试着把 1/3 的值写成小数。您最终会得到类似 的东西0.33333
,这是实际值的近似值。当您以二进制形式编写 5.55 时,也会发生同样的情况 - 它变成了101.10001100110011001100110011...
在某处被切断以适应双精度空间的情况。
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);
Java double 可能存在精度问题。
你为什么不试试BigDecimal
?
原因是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