用程式語言做計算,很多時候浮點數精度都是困擾過我的問題,即便是剛學php的新手也會在群裡問為什麼我的計算結果明顯不對,而我們總是老態龍鍾的丟出一句浮點數計算都存在精度問題,並沒有提出過什麼實質性的改善。比如下面的計算0.57*100
:
zhgxun-pro:~ zhgxun$ php -a
interactive shell
php > echo intval(0.57*100);
56php > echo 0.57*100;
57php >
看到結果其實我們已經想到了,很多時候我們忽略精度問題,一定意義上是因為我們沒有對計算結果進行型別轉換,巧妙的得到了更好的結果值。但是總會有(細心)的開發者會自作聰明的對結果進行指定,恰恰得到了相反的效果。這也是為什麼我一直沒有仔細想過這個問題的原因,按動態解釋性語言的特性,變數都是在執行時才最終確定的,所以不要刻意去轉換型別,即便你很確認變數就應該是這個樣子的。
後來我看了下,php確實有這麼乙個擴充套件庫,bcmath處理任意精度數字,對於任意精度的數學,php提供了支援用字串表示的任意大小和精度的數字的二進位制計算。自 php 4.0.4,libbcmath 隨同 php 一起發布,該擴充套件不需要任何外部的庫。官方文件提供的函式有如下這些:
bcadd — 2個任意精度數字的加法計算
bccomp — 比較兩個任意精度的數字
bcdiv — 2個任意精度的數字除法計算
bcmod — 對乙個任意精度數字取模
bcmul — 2個任意精度數字乘法計算
bcpow — 任意精度數字的乘方
bcpowmod — raise an arbitrary precision number to another, reduced by a specified modulus
bcscale — 設定所有bc數學函式的預設小數點保留位數
bcsqrt — 任意精度數字的二次方根
bcsub — 2個任意精度數字的減法
如果不是設計太複雜的運算,只需要其中的加減乘除既可以做到高精度的數學處理。
class test extends command
}
執行結果:
zhgxun-pro:ankerbox_finance zhgxun$ php artisan test
5657570
0.33333333333333
0.333333
zhgxun-pro:ankerbox_finance zhgxun$
結果跟說明的一樣,你只要不要刻意去做數字精度的轉換計算,php其實表現的很良好的,並沒有大家說的那麼可怕,覺得這門語言有太多的問題。只是可能當我們知道php有專門的函式來處理這個問題時,會不由自主的也覺得精度問題就應該這麼做才對,如果對方碰巧不知道這其中的問題,就覺得對方很low一般,而表現的很不尊重別人。 PHP任意精度數學函式擴充套件包BCMath
bcmath擴充套件提供了一套bc binary calculator 數學函式,它是乙個高精度運算的函式庫,可以準確地對任意精度的數字進行運算。php的windows版本已內建對此擴充套件的支援,linux版本則需要手動 安裝bcmath。bcadd left operand,right oper...
php計算 處理丟失精度問題 保留小數
解決方法 使用php的內庫libbcmath 自 php 4.0.4,libbcmath 隨同 php 一起發布。該擴充套件不需要任何外部的庫 a bcdiv 100,100,2 除法 那麼 a 1.00 bcadd 2個任意精度數字的加法計算 bccomp 比較兩個任意精度的數字 bcdiv 2個...
php精度計算
預設保留兩位小數 bcadd 引數1,引數2,引數3 引數1 和2 是要相加的引數 3是保留幾位小數。bcadd任意精度數的相加 bcsub任意精度數的減法 bcmul乘法,bcdiv除法 bcmod取餘數。比 功能更強大 bcpow冪函式運算 bcsqrt平方根 sqrt平方根運算 pow求冪 a...