Я использую PHP 5.5 (5.5.28)
Я столкнулся с действительно странной проблемой с арифметикой PHP
$value=29; $divisor=10;
$mod=$value%$divisor;
echo "$mod<br>";
возвращает 9 (как и ожидалось)
$value=(0.29*100); $divisor=(0.1*100);
$mod=$value%$divisor;
echo "$mod<br>";
возвращает 8 (????)
Я не могу найти ничего об этом в документации
Очевидно, что относительно легко написать функцию замены и использовать ее
Тем не менее, проблема, кажется, больше, в том, что я получаю странные ошибки округления, которые означают, что записи моей книги в проекте, над которым я работаю, не сбалансированы
Какие-либо предложения?
Это почти наверняка связано с тем, как хранятся числа с плавающей запятой, и у вас возникает проблема, при которой .29 * 100 не ТОЧНО равен 29, а 0,1 * 100 не ТОЧНО равен 10. Следовательно, если один немного меньше или больше чем вы ожидали, то вы получите результат, который на один. Если вы напечатаете свои промежуточные значения с десятичным знаком, вы, вероятно, сможете увидеть причину
Это точно та же проблема, что и у вас, когда вы пытаетесь сравнить равенство чисел с плавающей точкой, и вам приходится делать что-то вроде: if (fabs (a-b) < 0,0001), а не говорить: если (а == б)
Других решений пока нет …