0

数値のグループを合計すると、小数が少なくなることがありますか? 数値が文字列として解析されると、なぜこのようなことが起こるのでしょうか? フロートについていくつかの %"&! があることを知っています

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
4

2 に答える 2

3

「%」&!浮動小数点数について」というのは、浮動小数点数は単に正確ではないということです。無限の数が有限空間に格納される方法には、固有の不正確さがあります。したがって、浮動小数点数を使用して計算を行う場合、100% 正確な結果は得られません。

出力時に数値を四捨五入して小数点以下 2 桁にフォーマットするか、文字列とBC Math パッケージを使用するかを選択します。これは速度は遅いですが正確です。

于 2012-04-12T07:40:04.487 に答える
1

浮動小数点演算はコンピューターによって 2 進数で行われ、結果は 10 進数で表示されます。両方のシステムで同じように正確に表現できない数値が多数あるため、ほとんどの場合、人間が期待する結果と実際にビットとして見た結果との間には何らかの違いがあります (これが、ビットとして表示できない理由です)。 float が等しいかどうかを確実に比較します)。

PHP が算術演算子を検出するとすぐに、文字列を解析して数値が生成されるかどうかは問題ではありません。PHP は内部で文字列を数値に変換します。

絶対的な精度を必要としない場合(単に表示しているだけなので必要ないように見えます) 、小数点以下の桁数を制限するprintfなどのフォーマット文字列を使用するだけです。%.2f

于 2012-04-12T07:45:26.653 に答える