Точность PHP с плавающей запятой: Тайно ли округляется дамп var и как я могу тогда точно отладить?
Хорошо известно, что числа с плавающей запятой в PHP неточны (http://php.net/manual/de/language.types.float.php ), однако я немного недоволен после следующего эксперимента:
var_dump((2.30 * 100)); // float(230)
var_dump(round(2.30 * 100)); // float(230)
var_dump(ceil(2.30 * 100)); // float(230)
var_dump(intval(2.30 * 100)); // int(229)
var_dump((int)(2.30 * 100)); // int(229)
var_dump(floor(2.30 * 100)); // float(229)
Внутреннее представление должно быть чем-то вроде 229.999998
.
var_dump((2.30 * -100)); // float(-230)
var_dump(round(2.30 * -100)); // float(-230)
var_dump(ceil(2.30 * -100)); // float(-229)
var_dump(intval(2.30 * -100)); // int(-229)
var_dump((int)(2.30 * -100)); // int(-229)
var_dump(floor(2.30 * -100)); // float(-230)
Внутреннее представление должно быть чем-то вроде -229.999998
.
Хорошо, насколько я понимаю - целочисленное приведение, а также функция intval просто вырезают все, что находится за точкой. Хорошо, чтобы знать.
Однако var_dump()
дает мне значение 230, хотя реальное значение должно отличаться в соответствии с этими результатами.
Теперь взгляните на это:
$a = 230.0;
var_dump($a); // float(230)
var_dump((int) $a); // int(230)
Это означает, что внутреннее представление числа с плавающей запятой здесь должно быть другим. Если я хочу знать точное значение поплавка, поэтому я не могу отлаживать с помощью var_dump
, как я привык, верно? Как я могу отладить точное значение с плавающей запятой?
1 answers
Вы можете попробовать использовать число_формат это не будет идеально, так как вам нужно указать количество десятичных знаков, но должно помочь.
echo number_format(8-6.4, 50);
1.59999999999999964472863211994990706443786621093750
echo number_format(2.3*100, 50);
229.99999999999997157829056959599256515502929687500000
Редактировать: Поскольку количество десятичных знаков варьируется (это также зависит от используемой системы), может быть полезно следующее - точно получает полное число и удаляет конечные нули:
echo rtrim(number_format(1.0/3.432, 100),0);
0.29137529137529138978379705804400146007537841796875