2012-07-03 2 views
1

У меня возникли проблемы с (как я подозреваю,) ошибкой округления.Java Math.pow() Ошибка округления

У меня есть строка, 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); 

Итак, как избежать ошибок округления? (Есть способы, которыми я могу обойти это, но если это возможно, то я хотел бы знать, как исправить проблему)

Спасибо.

+0

Где ошибка? –

+1

Это не ошибка округления. Это то, как float/double ведут себя на большинстве языков программирования. У вас никогда не может быть 100% -ной точности, связанной с числами с плавающей запятой. Вот почему люди препятствуют использованию '(float1 == float2)', а просто 'abs (float1 - float2)

+0

Интересно - я никогда не испытывал такого поведения раньше. Нет способа избежать этого? – MattS

ответ

6

Вам не нужно разбить его, Double.parseDouble может обрабатывать эти виды чисел просто отлично.

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

See? It works!

+0

Проблема в том, что иногда число имеет показатель «E + 00», который, по-видимому, не понравился. В противном случае я бы сделал это так. – MattS

+0

@MattS: Хм ... это синтаксический анализ для меня просто отлично. http://ideone.com/onONy Я думаю, что ваша проблема в другом месте. – Ryan

+0

Интересно, я только что попробовал, и он действительно работал. Я, должно быть, ошибся с чем-то еще, что это испортило. Благодаря! – MattS

6

0.0686357 не является точно представленным как значение двойной точности.

Два решения:

  • Использование например, BigDecimal.
  • Ограничение отображаемой точности до определенного количества значимых цифр при обращении к читабельному человеку.
1

Номера с плавающей запятой не имеют идеальной точности. Если это является проблемой, используйте BigDecimal:

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

Double напечатает всегда так, но значение остается правильным. Вам нужно будет отформатировать вывод, чтобы получить правильное значение. См. DecimalFormat класс.

Смежные вопросы