Точность 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, как я привык, верно? Как я могу отладить точное значение с плавающей запятой?

Author: Blackbam, 2018-04-23

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

 2
Author: mleko, 2018-04-23 14:03:51