0
<?php
    $last_percent = 0;
    $as = array("110.800002098083",  "30", "36.1499996185303", "11", "13", "13.9899997711182", "74.5200042724609", "13.9899997711182");
    $t = 304.46000552177;
    foreach($as as $a) {
        $last_percent += round($a*100/$t, 2);
    }
    var_dump( $last_percent);
    $last_percent = 100 - $last_percent;
    var_dump( $last_percent);
?>

なぜ結果は 0.33000000000001 なのですか? なぜ100と99でしか起こらないのですか? $last_percent = 90 - $last_percent; を使用する場合 結果は-9.67

4

3 に答える 3

4

手短に言えば、float 値は完全ではないということです。システム設定によっては、エラーが発生する場合があります。

より長い答えは、float 値は数値の正確な表現ではなく、ほとんどの場合で十分な近似値であるということです。問題は、必要な値が float が完全に機能しない領域に入ることがあり、このような丸めエラーが発生することです。

これが、金融アプリケーションなどの正確な値に依存するシステムが float を使用しない理由です。これらは、特別な目的の高精度型を使用するか、ドルとセントを 2 つの別個の整数値で表します。

于 2012-10-25T03:52:42.513 に答える
1

100% の精度が必要な場合、浮動小数点計算は信頼できません。PHP ドキュメントには、 http://php.net/manual/en/language.types.float.phpに関する公式の警告があり、高精度の計算が必要な場合は、任意精度の数学関数または gmp 関数を使用する必要があります。

于 2012-10-25T03:51:10.420 に答える
0

浮動小数点数が正確でない理由:

小数を 2 進数の分数の合成として扱います。1/2 + 1/4 + 1/8 + 1/16 + ...

これですべての数値を完全に表現できるわけではないため、単純に「ベスト トライ」を示します。

于 2012-10-25T04:04:46.800 に答える