線上發現個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字符串類型。這點值得注意,能夠設置第三個參數,小數點位數。字符串