我正在尝试计算以下两个双精度的乘积:
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.514399999999999996838084825867554。 但是,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());