В настоящее время
json_encode()
используется значение EG (точность), которое установлено на 14. Это означает, что максимум 14 цифр используются для отображения (печати) номера. IEEE 754 double поддерживает более высокую точность и
serialize()/ или var_export() использует PG (serialize_precision), который по умолчанию должен быть более точным. Так как
json_encode() использует EG (точность),
json_encode() удаляет нижние цифры частей дроби и разрушает исходное значение, даже если float PHP может содержать более точное значение float.
И (внимание мое)
Этот RFC предлагает ввести новую настройку EG (precision) = - 1 и PG (serialize_precision) = - 1, которая использует режим zend_dtoa () 0, который использует лучший алгоритм для округления чисел с плавающей запятой (-1 используется для указания режима 0) ,
Короче говоря, есть новый способ заставить PHP 7.1
json_encode использовать новый и улучшенный механизм точности. В
php.ini вам нужно перейти serialize_precision на
serialize_precision = -1
.
Вы можете проверить, работает ли она с этой командной строкой
php -r '$price = ["price" => round("45.99", 2)]; echo json_encode($price);'
Вы должны получить
{"price":45.99}