2022年6月2日 星期四

PHP 浮點運算產生的問題,需要注意

PHP的浮點加減乘除運算,會產生小數位以下與設計師預期不一樣的結果。

例如: 
$sell_price = 123.456; 
$buy_price = 123.455; 
$t_diff = $sell_price - $buy_price; 
 預期結果是: 0.001,結果出來的是:0.00000000000098! 

這是因為浮點運算的緣故。原因就不說了。直接看如何處理?! 

 1. 先個別 x 1000,相減,然後再除1000 

 2. php提供了高精度計算的函式庫,實際上就是為了解決這個浮點數計算問題而生的。 

 主要函式有: 
  •  bcadd — 將兩個高精度數字相加 
  •  bccomp — 比較兩個高精度數字,返回-1, 0, 1 
  •  bcdiv — 將兩個高精度數字相除 
  •  bcmod — 求高精度數字餘數 
  •  bcmul — 將兩個高精度數字相乘 
  •  bcpow — 求高精度數字乘方 
  •  bcpowmod — 求高精度數字乘方求模,數論裡非常常用 
  •  bcscale — 配置預設小數點位數,相當於就是Linux bc中的”scale=” 
  •  bcsqrt — 求高精度數字平方根 
  •  bcsub — 將兩個高精度數字相減

** 切記:永遠不要相信浮點運算會精準到小數點最後一位,也不要拿浮點運算的數字來做比較是否相等?!

沒有留言:

張貼留言

如何判斷現在FORM是在 insert mode? 還是 update mode?

只要用  if (empty({primary_key})) 就可以知道是否為新增模式了。 如果 {promary_key} 是空白的,那麼就是在新增模式;反之,就是更新模式。 以上。