0

私は配列を持っています:

$test =array('49'=> '-0','51'=> '-0','50'=> '0','53'=> '-1.69','55'=> '0','57'=> '-2','59'=> '-6','60'=> '-12','65'=> '0','66'=> '0','67'=> '21.69','69'=> '0','70'=> '0','71'=> '0',); 

echo "\n".'===== First Method ========';
echo "\n\n".print_r($test);
echo "\n array_sum: ".array_sum($test);
echo "\n\n".'===== Second Method ========';

$total = 0;foreach($test as $value) $total += $value;
echo "\n foreach:".$total."\n";

結果は

gd@gd:~/Desktop$ php test.php

===== First Method ========Array
(
    [49] => -0
    [51] => -0
    [50] => 0
    [53] => -1.69
    [55] => 0
    [57] => -2
    [59] => -6
    [60] => -12
    [65] => 0
    [66] => 0
    [67] => 21.69
    [69] => 0
    [70] => 0
    [71] => 0
)


1
 array_sum: 3.5527136788005E-15

===== Second Method ========
 foreach:3.5527136788005E-15

それは間違っています。結果は 3.5527136788E-15 ではなく 0 になるはずです。どうすれば修正できますか?

4

4 に答える 4

2

これは、標準の浮動小数点演算精度エラーです。

php -r "echo -1.69 + -2 + -6 + -12 +21.69;"
3.5527136788005E-15%

float ではなく int を使用して修正できます。たとえば、常に 2 桁の精度が必要な場合は、すべての数値に 100 を掛け、整数に丸め、合計し、100 で割ります。

php -r "echo (-169 + -200 -1200 +2169 + -600) / 100;"
0%                                               
于 2013-08-24T00:03:11.537 に答える
1

文字列で array_sum を実行しています。値の引用符を削除するか、array_sum を使用する前にそれらを整数に変換してください。文字列が正しく整数に変換されていないと思います。携帯電話だけなので、詳細を確認できません。

お役に立てれば。

于 2013-08-24T00:00:39.890 に答える
0

値を引用符で囲むのではなく、浮動小数点数として値を指定しないのはなぜですか。それは基本的に文字列の合計になり、奇妙な結果が予想されます。文字列を数値に変換するために使用されていた PHP バージョン 4.something より前のことだと思います。特に10進数で問題になる可能性があります。

于 2013-08-24T00:02:45.460 に答える
0

これは、浮動小数点の不正確さの単なる例です。.69 を 2 進数で正確に表すことは不可能です (10 進数で 1/3 を正確に表すことができないのと同様)。

正確な数値が必要な場合は、bcmath php 拡張機能を使用して調べることができます。

于 2013-08-24T00:03:39.953 に答える