У меня есть странный математический расчет здесь. Надеюсь, кто-то объяснит.
$a = 1.85/100; $b = 1.5/100; $c = 1.1/100; $d = 0.4/100; $e = 0.4/100; $f = 0.4/100; $g = 0.4/100; $h = $a + $b + $c + $d + $e + $f + $g; echo $h*100 ."<br>"; $i = $h-$a; $i = $i-$b; $i = $i-$c; $i = $i-$d; $i = $i-$e; $i = $i-$f; $i = $i-$g; echo $i;
Последнее значение $i
должно быть 0, но оно возвращает 6.93889390391E-18.
любая идея исправить мое уравнение, чтобы показать конечный результат 0.00?
Да, round($i, 2)
«Расхождения» обычно настолько малы, что округление до двух десятичных знаков почти всегда решит проблему.
Вы должны прочитать эту статью:
Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой
Арифметика с плавающей точкой не является точной. Вы должны ожидать небольшие ошибки. Ответ верен в пределах небольшой ошибки округления. Если вам нужно проверить, является ли число с плавающей точкой нулевым, лучше не проверять, что он точно равен нулю, а вместо этого проверяет, достаточно ли он близок к нулю.
Если вам действительно нужна точная арифметика, не используйте типы с плавающей запятой. В вашем примере вы можете умножить все свои числа на 100 и использовать целочисленную арифметику для получения точного ответа.
В этом нет ничего плохого, просто округлые аппроксимации.
В этом случае вы должны умножить все свои значения на 1000 и сделать разделение в конце вычисления или, лучше, прибегнуть к точному расширению расчёта