Добавление значений с плавающей точкой, результат неожиданный - PullRequest
0 голосов
/ 03 февраля 2012

Я хочу добавить два огромных плавающих значения, но результат, который я получаю, немного сбивает с толку. Позвольте мне объяснить на примере:

String bi = "32323222.02";
float spend=0.00f;
spend = (Float.parseFloat(bi));

String si = "23232322.32";
float spend1=0.00f;
spend1 = (Float.parseFloat(si));

float spendSum=0.00f;
spendSum= spend+spend1;

System.out.println(spendSum);

Теперь результат для этого - 5.5555544E7, тогда как я хочу получить ответ типа 55555544.34. Любые предложения относительно того, что я могу сделать не так с примером, будут полезны.

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012
spend1 = (Float.parseFloat(bi));

Вы, вероятно, хотите разобрать si здесь.Это объясняет полученный результат: ваша программа добавляет 32323222.02 к 32323222.02.

2 голосов
/ 03 февраля 2012

с плавающей точкой не являются точными.Это потому, что в любом диапазоне есть бесконечное число рациональных чисел, но у вас есть только конечное число битов для их представления.

Если вы хотите получить точное значение, вы должны использовать BigDecimal .

Более подробную информацию о проблеме с плавающей запятой можно найти в этой [немного сложной] статье: Что должен знать каждый компьютерщик об арифметике с плавающей запятой

РЕДАКТИРОВАТЬ: Спасибо @ComplicatedSeeBio за его комментарий, я не заметил, что результат далек.В его ответе упоминается, почему разница составляет 20%.Однако даже без «программных ошибок» - вы все равно не получите ожидаемого результата из-за проблемы с плавающей запятой.

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