我知道php.ini中的新serialize_precision
设置,默认设置为-1
,precision
为14
。
正如预期的那样,php -r 'echo json_encode(2.49);'
命令的结果为2.49
。但php -r 'echo json_encode(2.09 + 0.4);'
的结果是2.4899999999999998
。
为什么以及如何在不改变php.ini配置的情况下修复它?
修改
要解释更多 - 这不是浮点数学的问题,这是关于json_encode()问题,因为简单加法php -r 'echo 2.09 + 0.4;'
产生2.49
的正确结果。
我的PHP版本:
PHP 7.2.0-2+ubuntu16.04.1+deb.sury.org+2 (cli) (built: Dec 7 2017 20:14:31) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.2.0-2+ubuntu16.04.1+deb.sury.org+2, Copyright (c) 1999-2017, by Zend Technologies
谢谢!
答案 0 :(得分:0)
我解决了这个问题。 此问题出现在7.1的更高版本(包含7.1)
中function _json_encode($arr) {
$func = function($r)use(&$func){
if ( is_array($r) ) {
foreach($r as $k=>$v) {
$r[$k] = $func($v);
}
return $r;
} else if ( is_float($r) ) {
return (float)(''.$r);
} else {
return $r;
}
};
if ( version_compare(PHP_VERSION, '7.1', '>=') ) {
$arr = $func($arr);
}
$arr = json_encode($arr);
return $arr;
}
echo _json_encode(2.09 + 0.4);// is 2.49
希望能帮到你。
答案 1 :(得分:0)
根据这里的讨论,似乎这是预期的行为(但不是明显的IMO): https://bugs.php.net/bug.php?id=75800