帶小數點的高精度運算

2021-08-04 18:54:54 字數 1098 閱讀 8511

前段日子,組長在寫乙個學科測試的排名邏輯,也不知怎麼的,就涉及了大量的小數運算,可能乘上乙個小數,然後再除了很大的數字,但是最後的結果,php只給了乙個整數,而忽略了小數。然後組長問我,我也一臉懵逼的。於是從網上找呀找,得知高精度運算時,可以使用bc庫帶的一些高精度的運算方法,如下:(複製過來的)

bcadd — 將兩個高精度數字相加 

bccomp — 比較兩個高精度數字,返回-1, 0, 1

bcdiv — 將兩個高精度數字相除

bcmod — 求高精度數字餘數

bcmul — 將兩個高精度數字相乘

bcpow — 求高精度數字乘方

bcpowmod — 求高精度數字乘方求模,數論裡非常常用

bcscale — 配置預設小數點位數

bcsqrt — 求高精度數字平方根

bcsub — 將兩個高精度數字相減

於是我自己做了一些測試,如下:

可以看到的是,當php的浮點數長度裝不下這串數字時,自動轉換成了字串型別。

這裡我總結了幾個點:

bc等函式的第三個引數,用來控制小數點後的位數(這個可以在手冊中查到),如果用來做加減乘除等高精度運算,這個引數還是很必要的,但是又有所區別。例如,在乘法運算中,我bcmul設定的是30位小數,顯然結果中並沒有30位。所以乘法中,設定的小數字數,如果實際結果沒有那麼多,也不會自動補零,而是直接展示最終結果。但是像除法,如果設定的位數過大,後面會自動補零。

如果你的數字長度過長,甚至超出浮點型別的長度,可以使用字串,也就是用「」將數字括起來。

在圖示中的除法,除數若是整數,最大長度是14位(100000000000000,好像是寫了14個0吧qaq),超過此長度,結果是null。

只要你有一處用了高精度運算,其他的運算也盡量保持使用高精度運算。不然結果,可能還是個整數qaq。

以上是個人的拙見,可能有不對的地方,歡迎指正。

小數點精度的控制

我的作業 現了對於小數點精度的控制,要求先要控制精度輸出,比如說小數點後必須為兩位,然後再取消這種控制 本文即針對該過程中我遇到的問題進行總結和給出解決方法。首先是針對c 情況下的小數點精度控制 對於c 的格式輸出,要用到cout.setprecision 和fixed,前面的乙個單獨使用是用來對於...

帶小數點的鍵盤

乙個很簡單快捷的方法就能做出非常完美的鍵盤 專案中使用方式更加簡單,直接上 吧。slnumberkeyboard tnumberkb slnumberkeyboard alloc init uitextfield mytext uitextfield alloc initwithframe cgre...

POJ 1001 高精度乘法加小數點處理

剛接觸高精度不久,就去poj找了一道題做,這道題,其實不用寫成高精度乘高精度,可以把問題解析稱幾個小問題,逐一解決.首先注意到,他是冪運算,所以,而且原數字數固定為 6位,所以,只用寫高精度乘乙個低位數即可,而高精乘乙個6位數,可以解析乘高精乘乙個1位數,在相加 a 123456 a 100000 ...