摘要:后來我看了下,確實有這么一個擴展庫,處理任意精度數(shù)字,對于任意精度的數(shù)學,提供了支持用字符串表示的任意大小和精度的數(shù)字的二進制計算。
用編程語言做計算,很多時候浮點數(shù)精度都是困擾過我的問題,即便是剛學PHP的新手也會在群里問為什么我的計算結(jié)果明顯不對,而我們總是老態(tài)龍鐘的丟出一句浮點數(shù)計算都存在精度問題,并沒有提出過什么實質(zhì)性的改善。比如下面的計算 0.57*100:
zhgxun-pro:~ zhgxun$ php -a Interactive shell php > echo intval(0.57*100); 56 php > echo 0.57*100; 57 php >
看到結(jié)果其實我們已經(jīng)想到了,很多時候我們忽略精度問題,一定意義上是因為我們沒有對計算結(jié)果進行類型轉(zhuǎn)換,巧妙的得到了更好的結(jié)果值。但是總會有(細心)的開發(fā)者會自作聰明的對結(jié)果進行指定,恰恰得到了相反的效果。這也是為什么我一直沒有仔細想過這個問題的原因,按動態(tài)解釋性語言的特性,變量都是在運行時才最終確定的,所以不要刻意去轉(zhuǎn)換類型,即便你很確認變量就應該是這個樣子的。
我記得在剛學PHP的時候,偶然間看到網(wǎng)絡上高洛峰的一個視頻,其間有一句話就說以后你們在PHP編程中,會遇到很多一時半會解釋不清楚的問題,那時候你們首先想到的應該是這門語言的特性--解釋性,自然你就會慢慢理解了。
后來我看了下,PHP確實有這么一個擴展庫,BCMath處理任意精度數(shù)字,對于任意精度的數(shù)學,PHP提供了支持用字符串表示的任意大小和精度的數(shù)字的二進制計算。自 PHP 4.0.4,libbcmath 隨同 PHP 一起發(fā)布,該擴展不需要任何外部的庫。官方文檔提供的函數(shù)有如下這些:
bcadd — 2個任意精度數(shù)字的加法計算
bccomp — 比較兩個任意精度的數(shù)字
bcdiv — 2個任意精度的數(shù)字除法計算
bcmod — 對一個任意精度數(shù)字取模
bcmul — 2個任意精度數(shù)字乘法計算
bcpow — 任意精度數(shù)字的乘方
bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus
bcscale — 設置所有bc數(shù)學函數(shù)的默認小數(shù)點保留位數(shù)
bcsqrt — 任意精度數(shù)字的二次方根
bcsub — 2個任意精度數(shù)字的減法
如果不是設計太復雜的運算,只需要其中的加減乘除既可以做到高精度的數(shù)學處理。
class Test extends Command { protected $signature = "test"; protected $description = "測試樣例"; public function handle() { // 使用BCMath進行高精度運算 $a = 0.57; $b = 100; echo intval($a * $b) . PHP_EOL; echo $a * $b . PHP_EOL; echo bcmul($a, $b) . PHP_EOL; $c = 1; $d = 3; echo intval($c / $d) . PHP_EOL; echo $c / $d . PHP_EOL; echo bcdiv($c, $d, 6) . PHP_EOL; } }
執(zhí)行結(jié)果:
zhgxun-pro:ankerbox_finance zhgxun$ php artisan test 56 57 57 0 0.33333333333333 0.333333 zhgxun-pro:ankerbox_finance zhgxun$
結(jié)果跟說明的一樣,你只要不要刻意去做數(shù)字精度的轉(zhuǎn)換計算,PHP其實表現(xiàn)的很良好的,并沒有大家說的那么可怕,覺得這門語言有太多的問題。只是可能當我們知道PHP有專門的函數(shù)來處理這個問題時,會不由自主的也覺得精度問題就應該這么做才對,如果對方碰巧不知道這其中的問題,就覺得對方很low一般,而表現(xiàn)的很不尊重別人。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/25810.html
摘要:浮點數(shù)類型包括單精度浮點數(shù)和雙精度浮點數(shù)。小結(jié)通過浮點數(shù)精度的問題,了解到浮點數(shù)的小數(shù)用二進制的表示。以后,在使用浮點數(shù)運算的時候,一定要慎之又慎,細節(jié)決定成敗。 概述 記錄下,工作中遇到的坑 ... 關(guān)于 PHP 浮點數(shù)運算,特別是金融行業(yè)、電子商務訂單管理、數(shù)據(jù)報表等相關(guān)業(yè)務,利用浮點數(shù)進行加減乘除時,稍不留神運算結(jié)果就會出現(xiàn)偏差,輕則損失幾十萬,重則會有信譽損失,甚至吃上官司,我...
摘要:說起浮點數(shù),大家都是又恨又愛的。當小數(shù)不為時,浮點數(shù)的值為,即不是一個數(shù)。所以,整個浮點數(shù)的二進制表示就是。最后其實,浮點數(shù)有很多坑。因此,我們在使用浮點數(shù)的時候,一定要小心。還有,涉及到金額計算的時候,一定不能使用浮點數(shù)。 本文為作者自己的總結(jié)的,由于作者的水平限制,難免會有錯誤,歡迎大家指正,感激不盡。 說起浮點數(shù),大家都是又恨又愛的。愛呢,是因為,只有它可以方便地使用小數(shù);恨呢,...
摘要:說起浮點數(shù),大家都是又恨又愛的。當小數(shù)不為時,浮點數(shù)的值為,即不是一個數(shù)。所以,整個浮點數(shù)的二進制表示就是。最后其實,浮點數(shù)有很多坑。因此,我們在使用浮點數(shù)的時候,一定要小心。還有,涉及到金額計算的時候,一定不能使用浮點數(shù)。 本文為作者自己的總結(jié)的,由于作者的水平限制,難免會有錯誤,歡迎大家指正,感激不盡。 說起浮點數(shù),大家都是又恨又愛的。愛呢,是因為,只有它可以方便地使用小數(shù);恨呢,...
閱讀 1641·2021-10-09 09:44
閱讀 2797·2021-10-08 10:04
閱讀 2470·2021-09-26 09:55
閱讀 3848·2021-09-22 10:02
閱讀 3314·2019-08-29 17:08
閱讀 1071·2019-08-29 15:08
閱讀 2960·2019-08-26 13:52
閱讀 3275·2019-08-26 13:34