как-то с годами начинаешь без особого содрогания смотреть на такие вот косяки (ой, а он не знает из чего float собран, и вообще * шарашит в много-JOIN-овые SELECT'ы, "ну а чо, работает же!").
ну не знает кто-то конкретной частной проблемы - не беда, главное, чтобы этот некто из конкретной ошибки умел делать своевременные и правильные выводы. лучше, конечно, если это будут выводы из чужих ошибок, но не всем и не всегда так везёт.
в любом случае, ремесло программиста предполагает знание достаточно большого числа явных и неявных зависимостей и невозможно заранее предсказать, насколько быстро человек использует или усваивает опыт, применимый (зачастую) лишь при решении конкретного класса задач.
по теме - ну явно же неразумно использовать в биллинге ни длинные, ни короткие decimal, ни float'ы всех мастей. использовать надо GNU MP и его аналоги, но это вообще отдельный холивар, да ещё и связанный с хранением промежуточных значений во внешних хранилищах (привет, SQL).
Надо в rational хранить, тогда вообще на всё можно положить. Никаких действий, кроме отнять-сложить-умножить-разделить, в биллинге в принципе быть не может. Хотя при сложении дробей с разными делителями результат может получиться некрасивый, на этот случай применяем вместо int'а бескончный int, как там он называется. :)
1/31 с 1/30 и 1/28 и 1/29 очень уж некрасиво складывается. Сразу наступит такой ад, что неясно, в чем недостаток хранить просто сразу с эпсилон-точностью, где эпсилон доказанно устраивает :)
Да нет разницы между numeric/decimal(фикс точка, основание 10) и float(плав.точка, основание 2). Либо мы храним дроби, либо нет. Если храним, реализация в любом случае замысловатая и примерно одинаковая для всех методов. Если нет, реализация простая, но тогда получается не биллинг, а простите говно.
Comments 32
Reply
Reply
Reply
ну не знает кто-то конкретной частной проблемы - не беда, главное, чтобы этот некто из конкретной ошибки умел делать своевременные и правильные выводы.
лучше, конечно, если это будут выводы из чужих ошибок, но не всем и не всегда так везёт.
в любом случае, ремесло программиста предполагает знание достаточно большого числа явных и неявных зависимостей и невозможно заранее предсказать, насколько быстро человек использует или усваивает опыт, применимый (зачастую) лишь при решении конкретного класса задач.
по теме - ну явно же неразумно использовать в биллинге ни длинные, ни короткие decimal, ни float'ы всех мастей.
использовать надо GNU MP и его аналоги, но это вообще отдельный холивар, да ещё и связанный с хранением промежуточных значений во внешних хранилищах (привет, SQL).
Reply
Reply
Reply
Reply
Reply
Reply
Сразу наступит такой ад, что неясно, в чем недостаток хранить просто сразу с эпсилон-точностью, где эпсилон доказанно устраивает :)
Reply
Reply
Reply
Reply
Reply
Либо мы храним дроби, либо нет.
Если храним, реализация в любом случае замысловатая и примерно одинаковая для всех методов.
Если нет, реализация простая, но тогда получается не биллинг, а простите говно.
Reply
P.S. Всё перечитал - всё равно не понял
Reply
Вообще я так понимаю у тебя это вспомогательная система всё-таки, с таким можно жить, это легкая шиза.
Reply
Leave a comment