Ашеплер объяснил механику того, что происходит хорошо, но фундаментальная проблема с вашим кодом заключается в использовании значения, которое не существует как float
в коде, которое зависит от значения его аппроксимации внестабильный путь.Если вы хотите умножить на 0,9 (фактическое число 0,9 = 9/10, а не значение с плавающей запятой 0.9
или 0.9f
), вы должны умножить на 9, затем разделить на 10 или забыть о типах с плавающей запятой и использовать десятичное числобиблиотека арифметики.
Дешевый и грязный способ решения проблемы, когда нестабильные точки изолированы, как в приведенном здесь примере, состоит в том, чтобы просто добавить значение (обычно 0,5), которое, как вы знаете, будет больше ошибки, номеньше, чем разница от следующего целого числа перед усечением.