为什么此代码打印 2.4099999999999997 ,而不仅仅是2.41
public class Main
{
public static void main(String args[])
{
double d = 5.55%3.14;
System.out.println(d);
}
}
答案 0 :(得分:3)
问题不在于模运算符,而在于浮点数的性质。双倍不能保持5.55,3.14或2.41的精确值,所以你得到一个近似的答案。
为了更好地理解这一点,当你在纸上只有有限的空间来写它时,尝试将1/3的值写为小数。你最终会得到像0.33333
这样的东西,它是实际值的近似值。当你用二进制文件写它时,5.55也会发生同样的情况 - 它会变成101.10001100110011001100110011...
,它会在某处被切断以适应双精度空间。
答案 1 :(得分:2)
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);
答案 2 :(得分:1)
Java double可能存在精度问题。
为什么不试试BigDecimal
?
答案 3 :(得分:1)
原因是java不像我们那样做数学。 java使用二进制数字(从Horstmann的大型java书的第4章开始)到计算机,435 = 4 * 10 ^ 2 + 3 * 10 ^ 1 + 5 * 10 ^ 0
这样做是因为二进制数字(1或0)更容易操作,因为计算机中的开关是打开或关闭(1或0)。
这导致了偶然的舍入问题。如果你想强制它循环,然后做一些事情,比如使用十进制格式,或者你只需要四舍五入的值,你可以使用String.format或printf