Потеря точности Java - PullRequest
       7

Потеря точности Java

1 голос
/ 05 марта 2010

У меня проблема с потерей точности

Моя задача - напечатать числа в виде строк

int exponent = ...
int[] Mantissas = { 1, 2, 5 };
double dataStep = java.lang.Math.pow(10.0, exponent) * Mantissas[mantissaIndex];
...
for (int i = 0; i < NSteps; i++)
                    steps[i] = firstStep + i * dataStep;
draw(steps);

например, 0,2 * 7 = 1,4000000000000001; 0.0000014 / 10 = 1.3999999999999998E-7

как решить эту проблему?

UPD : Основная проблема - строка форматирование вывода. я не беспокоюсь о потере около 0,00000001 стоимости. Теперь я решил это как String.format ("% f", значение), но я думаю, что это не очень хороший подход

Ответы [ 3 ]

3 голосов
/ 06 марта 2010

Как уже упоминалось, вы должны использовать java.math.BigDecimal вместо float / double.Это, однако, имеет свой собственный набор проблем.

Например, когда вы вызываете BigDecimal (double), значение, которое вы передаете, будет расширено до его полного представления:

BigDecimal oneTenth = new BigDecimal(0.1);
BigDecimal oneMillion = new BigDecimal(1000000);
oneTenth.multiply(oneMillion)
out> 100000.0000000000055511151231257827021181583404541015625000000

Но когда выиспользуйте конструктор BigDecimal (String), где будет представлено действующее значение, и вы получите

BigDecimal oneTenth = new BigDecimal("0.1");
BigDecimalr oneMillion = new BigDecimal(1000000);
oneTenth.multiply(oneMillion)
out> 100000.0

Подробнее об ограничениях BigDecimal вы можете прочитать в великолепной книге Джошуа Блоха и Нила Гафтера Java-головоломки и в это информативная статья.Наконец, обратите внимание, что toString в BigDecimal будет печататься в научной нотации, поэтому вместо этого вам придется правильно использовать toPlainString .

2 голосов
/ 05 марта 2010

Тип double не имеет бесконечной точности и не может точно представлять десятичные дроби.Вы наблюдаете нормальные ошибки округления.Для арифметики произвольной точности вам нужно будет использовать java.math.BigDecimal.

1 голос
/ 05 марта 2010

Ищите «числа с плавающей запятой» в SO, и вы получите множество ответов о том, почему это происходит. Это связано с тем, как числа с плавающей точкой представлены в компьютерах.

Как сохраняется число с плавающей запятой? Когда это имеет значение?

Еще одна статья по этому вопросу - Приближение с плавающей запятой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...