php、var_export 因浮动而失败
php, var_export fails with float
很简单。考虑这段代码:
var_export (11.2);
这个returns和
11.199999999999999
和Php5.6
wtf?
来自 php.net 手册页的评论:
Looks like since version 5.4.22 var_export uses the
serialize_precision ini setting, rather than the precision one used
for normal output of floating-point numbers. As a consequence since
version 5.4.22 for example var_export(1.1) will output
1.1000000000000001 (17 is default precision value) and not 1.1 as before.
很高兴知道。我也不知道这个变化。
Available since PHP 4.3.2. Until PHP 5.3.5, the default value was 100.
因此,我们可以获得我们熟悉的行为:ini_set('serialize_precision', 100)
;
警告
使用 ini_set() 时要非常小心,因为这可能会进一步改变代码的行为。一个“安全”的方法是使用这样的东西:
$storedValue = ini_get('serialize_precision');
ini_set('serialize_precision', 100);
// Your isolated code goes here e.g var_export($float);
ini_set('serialize_precision', $storedValue);
这可确保代码中的进一步更改 down/deeper 不受影响。
通常,在您的代码中使用 ini_set() 应该被认为是危险的,因为
它可能会产生严重的副作用。重构您的代码以在没有 ini_set() 的情况下运行通常是更好的选择。
很简单。考虑这段代码:
var_export (11.2);
这个returns和
11.199999999999999
和Php5.6
wtf?
来自 php.net 手册页的评论:
Looks like since version 5.4.22 var_export uses the serialize_precision ini setting, rather than the precision one used for normal output of floating-point numbers. As a consequence since version 5.4.22 for example var_export(1.1) will output 1.1000000000000001 (17 is default precision value) and not 1.1 as before.
很高兴知道。我也不知道这个变化。
Available since PHP 4.3.2. Until PHP 5.3.5, the default value was 100.
因此,我们可以获得我们熟悉的行为:ini_set('serialize_precision', 100)
;
警告
使用 ini_set() 时要非常小心,因为这可能会进一步改变代码的行为。一个“安全”的方法是使用这样的东西:
$storedValue = ini_get('serialize_precision');
ini_set('serialize_precision', 100);
// Your isolated code goes here e.g var_export($float);
ini_set('serialize_precision', $storedValue);
这可确保代码中的进一步更改 down/deeper 不受影响。
通常,在您的代码中使用 ini_set() 应该被认为是危险的,因为 它可能会产生严重的副作用。重构您的代码以在没有 ini_set() 的情况下运行通常是更好的选择。