json_encode()PHP7中的float精度和加法运算

时间:2018-01-11 11:04:58

标签: php json

我知道php.ini中的新serialize_precision设置,默认设置为-1precision14

正如预期的那样,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

谢谢!

2 个答案:

答案 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