У меня есть 2 числа, сохраненные как Double, 1.4300 и 1.4350. Когда я вычитаю 1,4350 - 1,4300, это дает мне результат: 0,0050000000000001155. Почему он добавляет 1155 в конец и как решить эту проблему, чтобы он возвращал 0,005 или 0,0050? Я не уверен, что округление будет работать, так как я работаю с 2 и 4 десятичными числами.
Двойной расчет с нечетным результатом
Ответы (3)
О, я люблю это... это вызвано неточностью в двойном представлении, и арифметика с плавающей запятой полна этого. Это часто вызвано повторяющимися числами в двоичном формате (т. е. представлением с плавающей запятой с основанием 2). Например, в десятичном виде 1/3 = 0,3333'. В двоичном формате 1/10 — это повторяющееся число, а это значит, что его невозможно точно представить. Попробуйте это: 1 - 0,1 - 0,1 - 0,1 - 0,1. Вы не получите 0,6 :-)
Чтобы решить эту проблему, используйте BigDecimal (предпочтительно) или манипулируйте двойным значением, сначала умножив его примерно на 10000, затем округлив, а затем снова разделив (менее чисто).
Хороший вопрос... в прошлом он вызывал огромные проблемы. Ракеты пролетают мимо целей, спутники падают после запуска и т. д. Поищите в Интернете, вы будете поражены!
Это распространенная ошибка с некоторыми компьютерными представлениями дробных чисел, см. этот вопрос или Google для точность с плавающей запятой.
Double не подходит для очень точных вычислений с плавающей запятой, если вам нужны точные результаты, вы должны использовать BigDecimal.