浮點數乘積的取整intval,以及高精度函數bcmath的使用

  線上發現個bug,浮點數乘積之後取整,獲得的數不符預期。還記得上次踩過的坑是數據庫類型轉換的一個問題。這個也至關於類型轉換了..尷尬php

  浮點數計算的精度必定要謹慎。數據庫

  例子以下:函數

<?php

$a = 18359.1;

$b = $a * 100;// float(1835910)

$c = intval($a * 100);// int(1835909)

var_dump($b);

var_dump($c);

  究其緣由,就是浮點數的二進制表示。當遇到循環的狀況,就會出現這種問題。好比 18359.1 * 100在二進制運算結果後,轉十進制,獲得的會是1835909.99999...spa

  這樣intval()之後,即是1835909了。.net

  

  知道了這樣的問題,有啥更好的方案麼?code

  能夠使用bcmath擴展,高精度函數的使用。bc 全稱 Binary Calculator,二進制計算器。blog

   用法見php文檔:http://php.net/manual/zh/function.bcadd.php文檔

bcadd — 加法
bccomp — 比較
bcdiv — 相除
bcmod — 求餘數
bcmul — 乘法
bcpow — 次方
bcpowmod — 先次方而後求餘數
bcscale — 給全部函數設置小數位精度
bcsqrt — 求平方根
bcsub — 減法

  bc庫的加減乘除的返回值是string字符串類型。這點值得注意,能夠設置第三個參數,小數點位數。字符串

相關文章
相關標籤/搜索