我正在尝试计算以下两个双打的乘积:
double x = 196.0d;
double y = 0.5144d;
double z = x * y;
这个问题的答案应该是z = 100.8224;
,但 java 将其计算为z = 100.82239999999999;
这是什么原因造成的?
我正在尝试计算以下两个双打的乘积:
double x = 196.0d;
double y = 0.5144d;
double z = x * y;
这个问题的答案应该是z = 100.8224;
,但 java 将其计算为z = 100.82239999999999;
这是什么原因造成的?
最接近 0.5144 的双精度浮点数是 4633303296638766 / 2 ^ 53,实际上是 0.51439999999999996838084825867554。但是,Java 将其显示为 0.5144,因为它具有启发式方法,可以在有一个足够接近给定双精度浮点数的情况下选择小数位数较少的数字。
但是,当您将相同的数字乘以 196 时,错误会更加复杂,最终得到 100.82239999999999380264625870041。这与 100.8224 不够接近,无法显示为 100.8224,因为还有另一个双精度浮点数更接近 100.8224。
尝试十进制格式
DecimalFormat decimalFormat = new DecimalFormat("##,###,###.####");
decimalFormat.format(z);
System.out.println(decimalFormat.format(z));
你可以这样做:
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());