Двойное минус int дает неожиданные результаты

Возможный дубликат:
Плавающий точечная арифметика не дает точных результатов в Java
Примеры неточности с плавающей запятой

В Java, учитывая следующий код:

    double amount = scan.nextDouble();

    tenBills = (int)amount / (int)10;
    amount = amount - (tenBills * 10);

    fiveBills = (int)amount / (int)5;
    amount = amount - (fiveBills * 5);

После первого расчета, если ввести, скажем, 16, сумма будет равна 6,66. Но после второго расчета сумма будет 1.6600000000000001. Я не понимаю, почему вычитание int из double может привести к такому результату.


person user1086516    schedule 25.12.2011    source источник
comment
Это называется арифметикой с плавающей запятой, и этот вопрос задают постоянно на ТАК. Прочтите это: csharpindepth.com/Articles/General/FloatingPoint.aspx   -  person Matt Ball    schedule 25.12.2011
comment
Получив ответ на свой прямой вопрос, вы можете использовать BigDecimal в коде, если вам нужна более высокая точность.   -  person joschi    schedule 25.12.2011


Ответы (2)


Вычитание int из числа типа double не изменяет только целую часть числа типа double. Также можно изменить масштаб. В вашем конкретном случае целая часть перед вычитанием (6) требует больше битов для представления, чем целая часть после вычитания (1). Это приводит к тому, что полное представление числа позволяет использовать больше дробных битов. Результаты могут быть (как вы выяснили) несколько неожиданными. (Каламбур предназначен)

person Ted Hopp    schedule 25.12.2011
comment
Годы спустя твой каламбур рассмеялся. - person Chris Cox; 04.09.2015

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

Если вам просто нужна сводка: компьютеры представляют все в двоичном формате. Двоичные представления при выполнении арифметики с плавающей запятой в некоторых ситуациях приводят к крошечным неточностям.

person Trott    schedule 25.12.2011