Php 数字之和返回奇数低小数?

Php 数字之和返回奇数低小数?,php,Php,当对一组数字求和时,有时我会得到一些低小数?当数字被解析为字符串时,为什么会发生这种情况?我知道关于浮动有一些“&!” function parse(){ foreach($_SESSION['import_csv_posts']['result']['csv'] as $key => $post){ $amount = $this->parse_amount($post[$this->param['amount']]); if($thi

当对一组数字求和时,有时我会得到一些低小数?当数字被解析为字符串时,为什么会发生这种情况?我知道关于浮动有一些“&!”

function parse(){
    foreach($_SESSION['import_csv_posts']['result']['csv'] as $key => $post){
        $amount = $this->parse_amount($post[$this->param['amount']]);
        if($this->param['vat_amount']){
            $amount += $this->parse_amount($post[$this->param['vat_amount']]);
        }

        $this->balance += $amount;
        echo "$amount\n";
    }

    echo "\nbalance = ".$this->balance;
}

function parse_amount($amount){
    $amount = strval($amount);
    if(strstr($amount, '.') && strstr($amount, ',')){
        preg_match('/^\-?\d+([\.,]{1})/', $amount, $match);
        $amount = str_replace($match[1], '', $amount);
    }

    return str_replace(',', '.', $amount);
}
结果

-87329.00
-257700.00
-11400.00
-9120.00
-47485.00
-15504.00
122800.00
1836.00
1254.00
200.00
360.00
31680.00
361.60
1979.20
1144.00
7520.00
6249.49
balance = -399.00000000003
“%”&!about float”是指float并不精确。无限数在有限空间中的存储方式存在某种固有的不精确性。因此,当使用浮点数进行数学运算时,不会得到100%的准确结果

您可以选择在输出时四舍五入到小数点后两位,或者使用字符串和,速度较慢,但准确。

!“关于浮点数”是指浮点数并不精确。无限数在有限空间中的存储方式存在一定的不精确性。因此,当使用浮点数进行数学运算时,您不会得到100%的精确结果


您可以选择在输出时四舍五入到小数点后两位,或者使用字符串和,虽然速度较慢,但精度较高。

浮点运算由计算机以二进制完成,而结果以十进制显示。在两种系统中,有许多数字无法同样精确地表示,因此几乎不存在作为一个人,当结果被视为比特时,在你期望的结果和实际结果之间总是存在一些差异(这就是你不能可靠地比较浮点值是否相等的原因)

通过解析字符串生成数字并不重要,只要PHP看到算术运算符,它就会在内部将字符串转换为数字


如果您不需要绝对精度(看起来您不需要,因为您只是在显示内容)然后简单地使用
printf
和格式字符串(如
%.2f
)来限制小数位数。

浮点运算是由计算机以二进制完成的,而结果是以十进制显示的。在两个系统中,有许多数字无法同样精确地表示,因此几乎所有的数字都是相同的作为一个人,你所期望的结果与作为比特看到的结果之间存在一些差异(这就是你无法可靠地比较浮点值是否相等的原因)

通过解析字符串生成数字并不重要,只要PHP看到算术运算符,它就会在内部将字符串转换为数字


如果您不需要绝对精度(看起来您不需要,因为您只是在显示内容),那么只需使用
printf
和格式字符串(如
%.2f
)来限制小数位数。

什么是“低小数”“?好的,请原谅我的无知,但我不知道您在哪里解析字符串以获得浮点值?@adnan在使用
+=
@deceze或任何人时会自动发生,有人能向我解释一下为什么求和的结果与问题中的输出不同吗?”?什么是“低小数”?好吧,请原谅我的无知,但我看不出你在哪里解析字符串以获得浮点值?@adnan在使用
+=
@deceze或任何人时会自动发生,有人能向我解释为什么求和的结果与问题中的输出不同吗?