Ваша проблема называется «ошибка округления» или «ошибка округления». Пример:
У вас есть два числа a
и b
. Вы знаете, что каждая имеет определенную точность (то есть количество цифр, в которых вы уверены), что означает, что каждая другая цифра является "случайным" шумом.
Представьте себе, b
имеет точность двух цифр. Результат (b*100)-int(b*100)
будет случайным, поскольку операция обрезает все «правильные» цифры.
Эти ошибки распространяются в зависимости от математической операции. Некоторые примеры:
Поля ошибок добавляются при добавлении чисел. Если a
и b
имеют точность два, добавление их может превратить вторую цифру дроби в мусор: 0,003 + 0,008 = 0,011
Умножение быстро увеличивает ошибку, а экспоненциальные функции увеличивают ее еще быстрее.
Деление уменьшает погрешность (0,003 / 3 = 0,001)
Таким образом, если вы хотите получить правильный ответ, вы должны вычислить границы ошибок всех операций в вашем коде, следуя правилам, изложенным выше. Связать кого-нибудь?
Конечно, это обычно не вариант. Поэтому вам нужно подумать, с какой ошибкой вы можете жить. Например, если вы выполняете математические операции с финансовыми данными, обычно достаточно точности 10 или 20, потому что у вас достаточно битов, чтобы «потратить» их на несколько математических операций, прежде чем ошибка перерастет в значительную часть значения.
Пример: вы начинаете с 10.500 000 000
и 3.100 000 000
. Если вы разделите два, вы получите 3.387 096 774
. Из этого вам понадобится только 3.87
- остальное - запасная точность, которую вы можете использовать в дальнейших операциях, пока вы не округлите последний результат до двух цифр и не сохраните его обратно в базе данных.