2017-02-06 9 views
0

Есть ли все-таки, чтобы проверить, имеет ли двойное округление java, например. -260.01079999999996Как проверить, имеет ли двойное округление java?

У меня есть одна система, которая передает вычисленное двойное значение. По праву должно быть -260.0108.

+1

Зачем беспокоиться? Просто используйте 'BigDecimal' и не беспокойтесь об этом. – TedTrippin

+2

Обычно вы сравниваете его с произвольным значением epsilon. Хотя назвать его «проблемой округления» кажется немного странным, поскольку никто не делает округления, и никто не просил об этом. –

+1

Вы всегда должны предположить, что существует потенциальная проблема округления, если вы не знаете, что нет –

ответ

0

При использовании поплавков и удвоений «проблемы» с округлением обусловлены ограничениями цифровых компьютеров.

Если вы не хотите округлять, используйте целые числа. Если вам нужно сохранить номер с фиксированным числом цифр после запятой, используйте BigDecimal; или всегда вокруг вашего двойника на X-й цифре после запятой; или используйте число как целое, разделив или умножив его на 10^n, прежде чем отображать его (см. ниже).

Например, вы можете сохранить -2600108 как целое число и коэффициент 1000. Сложение, вычитание, умножение и сохранение работы безупречно и без побочных эффектов в этом случае. Подразделение требует удвоения.

0

Если вы знаете из внешних доказательств, что точный ответ в определенной точке вашего кода должен быть целым числом, округленным до ближайшего целого числа.

В противном случае вы получите самый точный двойной результат, полностью выполнив ваши вычисления, используя DecimalFormat для печати только значимых цифр.

Нет ничего особенного в теме «java rounding». Особенность заключается в том, что выход по умолчанию сохраняет достаточно цифр, чтобы однозначно идентифицировать double. Многие другие языки, по умолчанию, округляются до меньшего количества цифр, теряя точность, но результаты выглядят более аккуратными.

Использование BigDecimal является крупной победой, если каждое число в вычислении может быть точно представлено как короткая десятичная дробь. Это часто происходит для расчетов в валюте. Однако, как только вы нажмете дробь, такую ​​как 1/3, которая не может быть точно представлена ​​каким-либо конечным числом десятичных цифр, вы все равно должны иметь дело с ошибкой округления. Для многих финансовых расчетов существуют фиксированные правила округления.

Теоретически BigDecimal также может использоваться для получения дополнительной точности, но это редко бывает практичным.