Java Math.pow()舍入错误

时间:2012-07-03 21:25:00

标签: java double

我遇到了(我怀疑的)舍入错误。

我有一个字符串0.686357E-01,我正在尝试将其转换为double。我已经能够使用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);

那么,我该如何避免舍入错误? (我可以通过各种方式解决这个问题,但如果可以做到,那么我想知道如何解决这个问题)

感谢。

4 个答案:

答案 0 :(得分:6)

0.0686357不能完全表示为双精度值。

两种解决方案:

  • 使用例如BigDecimal
  • 在转换回人类可读时,将显示的精度限制为一定数量的有效数字。

答案 1 :(得分:6)

你不需要拆分它,Double.parseDouble可以很好地处理这些数字。

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

See? It works!

答案 2 :(得分:1)

浮点数不具备完美的精度。如果这是一个问题,请使用BigDecimal

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

答案 3 :(得分:0)

Double将始终打印,但值仍将保持正确。您需要格式化输出以获取正确的值。见DecimalFormat class。