Java двойной эпсилон сравнения

40
задан Peter Mortensen 22 January 2011 в 18:21
поделиться

6 ответов

Да. Java удваивается, будет содержать их точность лучше, чем Ваш данный эпсилон 0,00001.

Любая погрешность округления, которая происходит из-за устройства хранения данных значений с плавающей точкой, произойдет меньшая, чем 0,00001. Я регулярно использую 1E-6 или 0.000001 для двойного эпсилона в Java без проблемы.

На связанной ноте, мне нравится формат epsilon = 1E-5;, потому что я чувствую, что это более читаемо (1E-5 в Java = 1 x 10^-5). 1E-6 легко отличить от 1E-5 при чтении кода, тогда как 0,00001 и 0,000001 взгляда, настолько подобные при поглядывании на код, я думаю, что они - то же значение.

13
ответ дан Alex B 27 November 2019 в 01:04
поделиться

Вы НЕ используете дважды для представления денег. Не когда-либо. Используйте java.math.BigDecimal вместо этого.

Тогда можно определить, как точно сделать округление (который иногда диктует закон в финансовых приложениях!) и не должны делать глупых взломов как эта вещь эпсилона.

Серьезно, с помощью типов с плавающей точкой для представления денег является чрезвычайно непрофессиональным.

104
ответ дан diralik 27 November 2019 в 01:04
поделиться

Стоп стоп стоп. Существует ли определенная причина, которую Вы используете с плавающей точкой за валюту, или вещи были бы более обеспечены с произвольная точность, числовой формат фиксированной точки ? Я понятия не имею, какова определенная проблема, которую Вы пытаетесь решить, но необходимо думать о том, является ли половина цента действительно чем-то, что Вы хотите работать с, или если это - просто артефакт использования неточного числового формата.

9
ответ дан Community 27 November 2019 в 01:04
поделиться

Если Вы имеете дело с деньгами, я предлагаю проверить Денежный шаблон разработки (первоначально от книга Martin Fowler по архитектурному проекту предприятия).

я предлагаю читать эту ссылку для мотивации: http://wiki.moredesignpatterns.com/space/Value+Object+Motivation+v2

5
ответ дан Yuval Adam 27 November 2019 в 01:04
поделиться

Центы? Если Вы - calculationg денежные значения, Вы действительно не должны использовать значения плавающие. Деньги являются на самом деле исчисляемыми значениями. Центы или пенсы и т.д. можно было считать двумя (или безотносительно) младшими значащими цифрами целого числа. Вы могли сохранить, и вычислить денежные значения как целые числа и разделиться на 100 (например, поместить точку или запятую два перед двумя последними цифрами). Используя плавание может привести к странным погрешностям округления...

Так или иначе, если Ваш эпсилон, как предполагается, определяет точность, это выглядит немного слишком маленьким (слишком точный)...

1
ответ дан Stein G. Strindhaug 27 November 2019 в 01:04
поделиться

Числа с плавающей точкой только имеют столько значащих цифр, но они могут стать намного выше. Если Ваше приложение будет когда-либо обрабатывать большие количества, Вы заметите, что значение эпсилона должно отличаться.

0.001+0.001 = 0.002, НО 12,345,678,900,000,000,000,000+1=12,345,678,900,000,000,000,000, если Вы используете плавающую точку и дважды. Это не хорошее представление денег, если Вы не будете чертовски уверены, что никогда не будете обрабатывать больше чем миллион долларов в этой системе.

1
ответ дан Karl 27 November 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: