Языку нужны три типа чисел с разными гарантиями
| Тип | Что это | Законы | Для чего |
|---|---|---|---|
число | IEEE-754 double | никаких | физика, графика, статистика |
сотых, тысячных | целое число минорных единиц | моноид, ассоциативность | деньги, счета, отчётность |
дробь | числитель / знаменатель | всё выше + точное деление | математика, где нужна точность |
Так сделано во всех серьёзных языках. Обычные дробные нужны, потому что быстрые и стандартные: для физики ошибка в пятнадцатом знаке не важна. Для денег они не годятся ни в одном языке.
Чем отличается наш случай. Ядро проверяет, что взят правильный тип. Моноид над точными копейками собирается: 5 значений, 125 троек, нарушений нет. Тот же моноид над число не собирается вовсе, и отказ называет вход:
FLANG_MONOID_ASSOC: на 0.1, 0.1, 0.6
слева вышло 0.8
справа вышло 0.7999999999999999
Честная оговорка. Коммутативность язык не проверяет — её нет в объявлении моноида, и обещать её было бы неправдой. Работа по добавлению запущена.
Связано: exact-decimals-are-free, double-has-no-laws, infinity-is-legal-without-subtraction