摘要:后來我看了下,確實(shí)有這么一個(gè)擴(kuò)展庫(kù),處理任意精度數(shù)字,對(duì)于任意精度的數(shù)學(xué),提供了支持用字符串表示的任意大小和精度的數(shù)字的二進(jìn)制計(jì)算。
用編程語(yǔ)言做計(jì)算,很多時(shí)候浮點(diǎn)數(shù)精度都是困擾過我的問題,即便是剛學(xué)PHP的新手也會(huì)在群里問為什么我的計(jì)算結(jié)果明顯不對(duì),而我們總是老態(tài)龍鐘的丟出一句浮點(diǎn)數(shù)計(jì)算都存在精度問題,并沒有提出過什么實(shí)質(zhì)性的改善。比如下面的計(jì)算 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é)果其實(shí)我們已經(jīng)想到了,很多時(shí)候我們忽略精度問題,一定意義上是因?yàn)槲覀儧]有對(duì)計(jì)算結(jié)果進(jìn)行類型轉(zhuǎn)換,巧妙的得到了更好的結(jié)果值。但是總會(huì)有(細(xì)心)的開發(fā)者會(huì)自作聰明的對(duì)結(jié)果進(jìn)行指定,恰恰得到了相反的效果。這也是為什么我一直沒有仔細(xì)想過這個(gè)問題的原因,按動(dòng)態(tài)解釋性語(yǔ)言的特性,變量都是在運(yùn)行時(shí)才最終確定的,所以不要刻意去轉(zhuǎn)換類型,即便你很確認(rèn)變量就應(yīng)該是這個(gè)樣子的。
我記得在剛學(xué)PHP的時(shí)候,偶然間看到網(wǎng)絡(luò)上高洛峰的一個(gè)視頻,其間有一句話就說以后你們?cè)赑HP編程中,會(huì)遇到很多一時(shí)半會(huì)解釋不清楚的問題,那時(shí)候你們首先想到的應(yīng)該是這門語(yǔ)言的特性--解釋性,自然你就會(huì)慢慢理解了。
后來我看了下,PHP確實(shí)有這么一個(gè)擴(kuò)展庫(kù),BCMath處理任意精度數(shù)字,對(duì)于任意精度的數(shù)學(xué),PHP提供了支持用字符串表示的任意大小和精度的數(shù)字的二進(jìn)制計(jì)算。自 PHP 4.0.4,libbcmath 隨同 PHP 一起發(fā)布,該擴(kuò)展不需要任何外部的庫(kù)。官方文檔提供的函數(shù)有如下這些:
bcadd — 2個(gè)任意精度數(shù)字的加法計(jì)算
bccomp — 比較兩個(gè)任意精度的數(shù)字
bcdiv — 2個(gè)任意精度的數(shù)字除法計(jì)算
bcmod — 對(duì)一個(gè)任意精度數(shù)字取模
bcmul — 2個(gè)任意精度數(shù)字乘法計(jì)算
bcpow — 任意精度數(shù)字的乘方
bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus
bcscale — 設(shè)置所有bc數(shù)學(xué)函數(shù)的默認(rèn)小數(shù)點(diǎn)保留位數(shù)
bcsqrt — 任意精度數(shù)字的二次方根
bcsub — 2個(gè)任意精度數(shù)字的減法
如果不是設(shè)計(jì)太復(fù)雜的運(yùn)算,只需要其中的加減乘除既可以做到高精度的數(shù)學(xué)處理。
class Test extends Command { protected $signature = "test"; protected $description = "測(cè)試樣例"; public function handle() { // 使用BCMath進(jìn)行高精度運(yùn)算 $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)換計(jì)算,PHP其實(shí)表現(xiàn)的很良好的,并沒有大家說的那么可怕,覺得這門語(yǔ)言有太多的問題。只是可能當(dāng)我們知道PHP有專門的函數(shù)來處理這個(gè)問題時(shí),會(huì)不由自主的也覺得精度問題就應(yīng)該這么做才對(duì),如果對(duì)方碰巧不知道這其中的問題,就覺得對(duì)方很low一般,而表現(xiàn)的很不尊重別人。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/25810.html
摘要:浮點(diǎn)數(shù)類型包括單精度浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)。小結(jié)通過浮點(diǎn)數(shù)精度的問題,了解到浮點(diǎn)數(shù)的小數(shù)用二進(jìn)制的表示。以后,在使用浮點(diǎn)數(shù)運(yùn)算的時(shí)候,一定要慎之又慎,細(xì)節(jié)決定成敗。 概述 記錄下,工作中遇到的坑 ... 關(guān)于 PHP 浮點(diǎn)數(shù)運(yùn)算,特別是金融行業(yè)、電子商務(wù)訂單管理、數(shù)據(jù)報(bào)表等相關(guān)業(yè)務(wù),利用浮點(diǎn)數(shù)進(jìn)行加減乘除時(shí),稍不留神運(yùn)算結(jié)果就會(huì)出現(xiàn)偏差,輕則損失幾十萬(wàn),重則會(huì)有信譽(yù)損失,甚至吃上官司,我...
摘要:獲取變量的類型,使用函數(shù)。要檢驗(yàn)?zāi)硞€(gè)類型,可以使用函數(shù),如是在整形是在浮點(diǎn)型是在字符串如果需要將一個(gè)變量強(qiáng)制轉(zhuǎn)換為某類型,可以對(duì)其使用強(qiáng)制轉(zhuǎn)換或者函數(shù)。自起,此限制僅對(duì)包含變量時(shí)有效。 簡(jiǎn)介 PHP支持9種原始數(shù)據(jù)類型。 4種標(biāo)量類型: boolean布爾型 integer 整形 float 浮點(diǎn)型(也稱作double) string 字符串 3種復(fù)合類型: array...
摘要:說起浮點(diǎn)數(shù),大家都是又恨又愛的。當(dāng)小數(shù)不為時(shí),浮點(diǎn)數(shù)的值為,即不是一個(gè)數(shù)。所以,整個(gè)浮點(diǎn)數(shù)的二進(jìn)制表示就是。最后其實(shí),浮點(diǎn)數(shù)有很多坑。因此,我們?cè)谑褂酶↑c(diǎn)數(shù)的時(shí)候,一定要小心。還有,涉及到金額計(jì)算的時(shí)候,一定不能使用浮點(diǎn)數(shù)。 本文為作者自己的總結(jié)的,由于作者的水平限制,難免會(huì)有錯(cuò)誤,歡迎大家指正,感激不盡。 說起浮點(diǎn)數(shù),大家都是又恨又愛的。愛呢,是因?yàn)椋挥兴梢苑奖愕厥褂眯?shù);恨呢,...
摘要:說起浮點(diǎn)數(shù),大家都是又恨又愛的。當(dāng)小數(shù)不為時(shí),浮點(diǎn)數(shù)的值為,即不是一個(gè)數(shù)。所以,整個(gè)浮點(diǎn)數(shù)的二進(jìn)制表示就是。最后其實(shí),浮點(diǎn)數(shù)有很多坑。因此,我們?cè)谑褂酶↑c(diǎn)數(shù)的時(shí)候,一定要小心。還有,涉及到金額計(jì)算的時(shí)候,一定不能使用浮點(diǎn)數(shù)。 本文為作者自己的總結(jié)的,由于作者的水平限制,難免會(huì)有錯(cuò)誤,歡迎大家指正,感激不盡。 說起浮點(diǎn)數(shù),大家都是又恨又愛的。愛呢,是因?yàn)椋挥兴梢苑奖愕厥褂眯?shù);恨呢,...
閱讀 1639·2021-10-09 09:44
閱讀 2787·2021-10-08 10:04
閱讀 2468·2021-09-26 09:55
閱讀 3840·2021-09-22 10:02
閱讀 3311·2019-08-29 17:08
閱讀 1069·2019-08-29 15:08
閱讀 2957·2019-08-26 13:52
閱讀 3274·2019-08-26 13:34