2011-02-22 106 views
1

我不知道我在做什麼錯,但這種計算bcmath時似乎給出了錯誤的答案,我計算

bcscale(20); 
echo bcmul(bcdiv('422218', '2388865'), '473'); 

回聲「83.59999999999999999670」但其它計算器給我83.6。

有沒有辦法解決這個問題,還是它在bcmath中的缺陷?

+1

這似乎是一個解釋的例子。爲什麼不重新排序操作,或者只是使用普通的PHP浮點運算,如果這是你想要的? – mario 2011-02-22 20:21:27

回答

4

你看到這個結果的原因是因爲你第一個執行劃分。

劃分爲您提供:

422218/2388865 
0.17674418604651162790697674418604651163 

,但你問數字,這樣就顯得0.1767441860465116279。有鑑於此,BC現在給你正確的結果:

0.1767441860465116279*473 
83.5999999999999999967 

在這種情況下的「解決方案」將首先執行乘法(它給你「只是」 9位數字),然後分工:

bcscale(20); 
echo bcdiv(bcmul('422218','473'),'2388865'); 
83.60000000000000000000 
0

BCMath爲您提供確切的結果。如果你需要其他的數字 「形式」,使用功能,如round()改變它:

http://php.net/manual/en/function.round.php

例如:

echo round(bcmul(bcdiv('422218', '2388865'), '473'), 1); 

會給你83.6。

+0

確切的結果是`418/5`或`83.6`。 – Eelvex 2011-02-22 20:18:00

+0

「精確」結果指的是計算機計算出的確切數字 - 正如有人說它具有有限的精度,所以結果也將「有限」。 – 2011-02-22 20:19:25

+0

@TomaszKowalczyk我看到我做錯了什麼,我很可能會使用類似這樣的東西來解決它,在另一個問題中找到一個不錯的bcround()函數[link](http://stackoverflow.com/questions/1642614/how我想我會用它來減少我顯示的數字的精確度。 – Zzzarka 2011-02-22 20:45:18

1

bcmath函數使用任意精度算術。這些計算並不是100%準確的 - 它們只是像你所要求的那樣精確(你要求20分)。由於計算不準確,你不能總是期望答案是準確的。

你說你的計算器在這種情況下給你正確的答案。但假設它也使用任意精度算術(大部分都是這樣),在其他情況下它會給你錯誤的答案。一些計算器通過以比他們可以顯示的更高的精度計算來隱藏它們的不準確性(例如,額外的兩位數)。如果您執行一個計算錯誤,它將最終在顯示中可見。

0

您已經指定了比大多數計算器可以執行的更精確(20位)。所以他們會把它捨去,最有可能的是10或15位數字,給出83.5999 ... 99,這輪到83.6。

相關問題