いまだに正確な結果が得られません。最大は何ですか。できるだけ正確にしたい場合、表示する必要がある小数の量は?
いくつかのコード (コピーして貼り付けてテストする準備ができています):
// Test with 5 decimals
$a = 0.00001;
echo bcadd($a,$a,5) . '<br/>';
echo bcadd($a,$a,6) . '<br/>';
echo number_format(bcadd($a,$a,5),5) . '<br/>';
echo number_format(bcadd($a,$a,5),6) . '<br/>';
echo bcadd(0.00001,0.00001,20) . '<br/>';
echo number_format(bcadd($a,$a,20),5) . '<br/>';
echo number_format(bcadd($a,$a,20),21) . '<br/><br/>';
/* Output:
0.00000
0.000000
0.00000
0.000000
0.00000000000000000000
0.00000
0.000000000000000000000
*/
// Test with 4 decimals
$a = 0.0001;
echo bcadd($a,$a,5) . '<br/>';
echo bcadd($a,$a,6) . '<br/>';
echo number_format(bcadd($a,$a,5),5) . '<br/>';
echo number_format(bcadd($a,$a,5),6) . '<br/>';
echo bcadd(0.00001,0.00001,20) . '<br/>'; // wtf? this outputs 0 too?
echo number_format(bcadd($a,$a,20),5) . '<br/>';
echo number_format(bcadd($a,$a,20),21) . '<br/>';
/* Output:
0.00020
0.000200
0.00020
0.000200
0.00000000000000000000
0.00020
0.000200000000000000010
*/
答えは 4 だと推測する必要がありますか ??? しかし、コメントのある行にはまだ問題があります
編集:誰も私のテストを理解していないと思います。フロートが不正確であることは知っています。しかし、一方は 1 != 0.98990123 であり、もう一方は 1 != 0.0000 です。bc* 関数の精度として 4 を設定すると、0.0000 ではなく、少なくとも 0.9899 (完全な答えが 1 の場合) になると予想されます。1つは「無限の精度に対して完全に正確ではない」ことであり、もう1つは「まったく役に立たない」ことです。
編集2:@Michael Borgwardtには解決策があります