为什么此代码打印 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 的 java 大书的第 4 章),因此对于计算机来说,435 = 4 * 10^2 + 3 * 10^1 + 5 * 10^0
这样做是因为二进制数(1或0)更容易操作,因为计算机中的开关要么打开要么关闭(1或0)。
这会偶尔导致舍入问题。如果你想强制它四舍五入,那么可以使用小数格式,或者如果你只需要四舍五入显示的值,你可以使用 String.format 或 printf