Java的Math.pow()舍入误差(Java Math.pow() Rounding Error

2019-07-30 05:55发布

我有麻烦(我怀疑是)一个舍入误差。

我有一个字符串, 0.686357E-01 ,这我想转换为双。 我已经能够使用它分裂Pattern.split()函数,而我拍摄基地和指数值就好了。 但是,一旦我尝试适当地将它们相乘,我得到这个结果: 0.06863570000000001

这里是我的相关代码:

pattern = Pattern.compile("E\\+?");
String[] number = pattern.split(string);

double base = Double.parseDouble(number[0]);
int exponent = Integer.parseInt(number[1]);

number= base*Math.pow(10, exponent);

那么,如何避免舍入误差? (有,我可以解决它的方法,但如果它是可以做到的话,我想知道如何解决这个问题)

谢谢。

Answer 1:

你并不需要拆分它, Double.parseDouble可以处理这些类型的数字就好了。

double number = Double.parseDouble("0.686357E-01");

看到? 有用!



Answer 2:

0.0686357是不作为双精度值精确表示。

两种解决方案:

  • 使用如BigDecimal
  • 转换回人类可读时限制显示的精度到一定数量的显著数字。


Answer 3:

浮点数没有完美的精度。 如果这是一个问题,使用的BigDecimal :

String string = "0.686357E-01";
BigDecimal number = new BigDecimal(string);
System.out.println(number);


Answer 4:

Double将总是打印这样的,但该值将保持正确的。 你需要格式化输出,以获得正确的值。 见DecimalFormat类。



文章来源: Java Math.pow() Rounding Error
标签: java double