Чтобы закрыть тему foat-ов, разовью еще немного 0.9(9) = 1 и фобию по поводу "аааа страшная потеря точности" в виде 0.9999999998765.
В Фейсбуке прислали прекрасное.
http://asvetlov.blogspot.ru/2011/02/blog-post.html?m=1 * * *
Надо ли использовать float-ы в биллинге или нет, вопрос десятый. Скорее, не надо.
Хотя так вышло, что в любом сложном биллинге когда-нибудь выясняется, что хорошо бы они были. Либо разбиения (которые удобно не только вычислять, а и хранить). Либо курсы. Либо проценты. Либо слишком высокая значимость копейки в валюте. Либо еще что-нибудь. И всё это не только в памяти, где посчитал и округлил, но и на диске лежит.
Конечно, decimal с 8 знаками после запятой лучше гарантирует от расчетных ошибок, но я знаю ЕДИНСТВЕННУЮ пожалуй разницу - float переполнение мантиссы сожрет молча, с потерей точности, а decimal при аккуратной реализации будет брыкаться.
Но.
Общий некий нуль программистов по поводу float-а очень выбешивает каждый раз. И соответствующая конкретная такая фобия.
Я за правильное их восприятие.
Потому что в результате получается, что биллинг у нас с точностью до копеек и поэтому состоит из костылей чуть менее чем на 100%. Что он правильно не решает никакие вообще бизнес-задачи, кроме специально под это дело упрощенных, где месяц состоит из 30 дней, а никакая общепринятая в экономике арифметика расчетных дат не реализована в принципе. Что до decimal c 6-8 знаками люди доходят только опытом, а окружающие не понимают, что это эквивалентно float-у на 99.9% (расчеты одинаковые, вопросы округления одинаковые, и так далее), хотя decimal с 8 знаками выглядит высоконаучно, а за float крутят у виска. И так далее.
* * *
(это случился очередной юбилейный пост на тему "блин, почему же программисты не умеют программировать", простите)