>Благодарю Вас за рекомендации.
>Хотелось бы услышать побольше мнений, особенно людей, которые решали данную проблему, и
>как Они ее решили (практически).
>
>з.ы. Д.Кнута пока что не читал :( может кто подскажеть где она
>лежит? (возможно в формате pdf)
Ну вот я, к примеру, решал похожую проблему.
В одной большой и серьезной системе длительное время денежные величины
представлялись в виде float. Да, даже не double, а float.
Это нехорошо, но денежные расчеты для этой системы не являются основной функцией, поэтому долгое время все всех устраивало, хотя иногда и вылезали неприятные артефакты. Ну, например, складываем несколько чисел типа float, а потом вычитаем их же их полученной суммы. Так вот, в результате ноль получался не всегда. Поэтому приходилось сравнивать результат не с нулем, а с маленьким по модулю числом, заведомо меньшим, чем минимальное реальное значение в данном приложении. Ну, такие приемы всем известны и описаны наверное в книгах, которые я давно уже не читал...
Потом все стало хуже. Изучение проблемы привело к выводу, что в рамках float, double, long double и т.д. в принципе нельзя делать точных денежных вычислений потому, что эти числа являются ДВОИЧНЫМИ ЧИСЛАМИ С ПЛАВАЮЩЕЙ ТОЧКОЙ. Да никто так и не делает, если серьезно.
Например, двоичное число 0.1 - это десятичное 0.5
А вот если, к примеру, десятичное 0.2 перевести в двоичный вид, то получите бесконечную периодическую двоичную дробь. Попробуйте.
Но в комьютере все числа конечные, поэтому В КОМПЬЮТЕРЕ НЕВОЗМОЖНО ТОЧНО ПРЕДСТАВИТЬ ЧИСЛО 0.2 В ФОРМАТЕ С ПЛАВАЮЩЕЙ ТОЧКОЙ.
Просто невозможно и все.
И так обстоит дело с большинством чисел, которые являются конечными десятичными дробями.
На этом изучение проблемы было прекращено, а для денежных величин были сделаны собственные классы, которые внутри работают только с целыми числами.
Если Вам нужна точность, то Вы должны использовать целочисленную арифметику. Числа с плавающей точкой - они не для этого.