1

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

我有一个字符串,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);

那么,如何避免舍入误差呢?(有一些方法可以解决它,但如果有可能,那么我想知道如何解决这个问题)

谢谢。

4

4 回答 4

6

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

两种解决方案:

  • 使用例如BigDecimal
  • 转换回人类可读时,将显示的精度限制为一定数量的有效数字。
于 2012-07-03T21:27:29.007 回答
6

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

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

看?有用!

于 2012-07-03T21:29:40.423 回答
1

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

String string = "0.686357E-01";
BigDecimal number = new BigDecimal(string);
System.out.println(number);
于 2012-07-03T21:27:31.830 回答
0

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

于 2012-07-03T21:35:38.970 回答