我正在尝试计算以下两个双打的乘积:
double x = 196.0d;
double y = 0.5144d;
double z = x * y;
答案应为z = 100.8224;
,但java会将其计算为z = 100.82239999999999;
造成这种情况的原因是什么?
答案 0 :(得分:5)
最接近的双精度浮点数为0.5144是4633303296638766/2 ^ 53,实际上是0.51439999999999996838084825867554。但是,Java将其显示为0.5144,因为如果有一个与给定的双精度浮点数足够接近的数字,它可以选择具有较少小数位数的启发式。
当您将相同的数字乘以196时,错误会复合,您将以100.82239999999999380264625870041结束。这不足以使100.8224显示为100.8224,因为还有另一个双精度浮点数接近100.8224。
答案 1 :(得分:2)
DecimalFormat decimalFormat = new DecimalFormat("##,###,###.####");
decimalFormat.format(z);
System.out.println(decimalFormat.format(z));
答案 2 :(得分:0)
你可以这样做:
double x = 196.0d;
double y = 0.5144d;
BigDecimal bigdec = new BigDecimal(x).multiply(new BigDecimal(y));
bigdec = bigdec.setScale(4, BigDecimal.ROUND_HALF_UP);
System.out.println(bigdec.doubleValue());