Зверніть увагу, що у вас була б така ж проблема, якби ви використовували десяткову арифметику з обмеженою точністю і хотіли мати справу з 1/3: 0,333333333 * 3 - це 0,999999999, а не 1 000 000 000.
На жаль, 5,6, 5,8 і 11,4 просто не є круглими числами у двійкових, оскільки вони включають п'яті. Тож представлення їх поплавця не є точним, так само як 0,3333 не є точно 1/3.
Якщо всі використовувані вами числа є неодноразовими десятковими знаками, і ви хочете точних результатів, використовуйте BigDecimal. Або, як говорили інші, якщо ваші значення схожі на гроші в тому сенсі, що всі вони кратні 0,01, або 0,001, або щось таке, то помножте все на фіксовану потужність 10 і використовуйте int або long (додавання і віднімання тривіальне: стежте за множенням).
Однак, якщо ви задоволені двійковим методом для розрахунку, але ви просто хочете роздрукувати речі у трохи дружнішому форматі, спробуйте java.util.Formatter
або String.format
. У рядку формату задайте точність, меншу, ніж подвійна точність. До 10 значущих цифр, скажімо, 11,399999999999 - це 11,4, тому результат буде майже таким же точним і зрозумілим для людини у випадках, коли двійковий результат дуже близький до значення, що вимагає лише декількох знаків після коми.
Точність вказувати трохи залежить від того, скільки математики ви зробили зі своїми цифрами - загалом, чим більше ви робите, тим більше помилок накопичуватиметься, але деякі алгоритми накопичують її набагато швидше, ніж інші (їх називають "нестабільними", оскільки на відміну від "стабільного" щодо помилок округлення). Якщо все, що ви робите, це додавання кількох значень, то я б припустив, що випадання лише одного десяткового знаку точності вирішить справи. Експеримент.