PHP 8 浮点数不同于 PHP 7
PHP 8 float decimal point different than PHP 7
我将一些会计脚本升级到 PHP 8.1,但是我得到的浮点数不正确。
我循环了一些交易 debit/credit 并且余额为 0 但是最后当我尝试比较零时它不适用于 == 0 和 === 0
经过几次调试发现:
<?php
var_dump(1097.5 - 835.7);
returns浮动(261.79999999999995)
与 PHP 中的同一行 7 returns
浮动(261.8)
这可以很容易地使用这个 sandbox
进行测试
所以我想知道是否可以在我的 PHP 配置中更改任何设置,以确保我获得与之前相同的浮动结果,而不必在数百个脚本的每个阶段都进行汇总?
PHP 8.0 UPGRADE NOTES:
var_dump() and debug_zval_dump() will now print floating-point numbers
using serialize_precision rather than precision. In a default configuration,
this means that floating-point numbers are now printed with full accuracy
by these debugging functions.
所以你可以改变这个
ini_set('serialize_precision', 16);
https://3v4l.org/uOAPD#v8.1rc3
但是,我怀疑这不是你真正的问题!因为此更改仅影响“这些调试功能”以及 serialize
、json_encode
等序列化功能
我将一些会计脚本升级到 PHP 8.1,但是我得到的浮点数不正确。
我循环了一些交易 debit/credit 并且余额为 0 但是最后当我尝试比较零时它不适用于 == 0 和 === 0
经过几次调试发现:
<?php
var_dump(1097.5 - 835.7);
returns浮动(261.79999999999995)
与 PHP 中的同一行 7 returns 浮动(261.8)
这可以很容易地使用这个 sandbox
进行测试所以我想知道是否可以在我的 PHP 配置中更改任何设置,以确保我获得与之前相同的浮动结果,而不必在数百个脚本的每个阶段都进行汇总?
PHP 8.0 UPGRADE NOTES:
var_dump() and debug_zval_dump() will now print floating-point numbers using serialize_precision rather than precision. In a default configuration, this means that floating-point numbers are now printed with full accuracy by these debugging functions.
所以你可以改变这个
ini_set('serialize_precision', 16);
https://3v4l.org/uOAPD#v8.1rc3
但是,我怀疑这不是你真正的问题!因为此更改仅影响“这些调试功能”以及 serialize
、json_encode