PHP浮點數的精確計算BCMath
Php: BCMath
bc是Binary Calculator的縮寫。bc*函式的引數都是運算元加上一個可選的 [int scale],比如string bcadd(string leftoperand,stringright_operand[, int $scale]),如果scale沒有提供,就用bcscale的預設值。這裡大數直接用一個由0-9組成的string表示,計算結果返回的也是一個 string。
bcadd — 將兩個高精度數字相加
bccomp — 比較兩個高精度數字,返回-1, 0, 1
bcdiv — 將兩個高精度數字相除
bcmod — 求高精度數字餘數
bcmul — 將兩個高精度數字相乘
bcpow — 求高精度數字乘方
bcpowmod — 求高精度數字乘方求模,數論裡非常常用
bcscale — 配置預設小數點位數,相當於就是Linux bc中的”scale=”
bcsqrt — 求高精度數字平方根
bcsub — 將兩個高精度數字相減
首先看一段程式碼:
<?php
$a = 0.1;
b=0.7;vardump((a + $b) == 0.8);
列印出來的值居然為 boolean false
這是為啥?PHP手冊對於浮點數有以下警告資訊:
Warning
浮點數精度
顯然簡單的十進位制分數如同 0.1 或 0.7 不能在不丟失一點點精度的情況下轉換為內部二進位制的格式。這就會造成混亂的結果:例如,floor((0.1+0.7)*10) 通常會返回 7 而不是預期中的 8,因為該結果內部的表示其實是類似 7.9999999999…。
這和一個事實有關,那就是不可能精確的用有限位數表達某些十進位制分數。例如,十進位制的 1/3 變成了 0.3333333. . .。
所以永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。如果確實需要更高的精度,應該使用任意精度數學函式或者 gmp 函式
那麼上面的算式我們應該改寫為
<?php
$a = 0.1;
b=0.7;vardump(bcadd(a,$b,2) == 0.8);
這樣就能解決浮點數的計算問題了
本文轉自TBHacker部落格園部落格,原文連結:http://www.cnblogs.com/jiqing9006/p/5531687.html,如需轉載請自行聯絡原作者
相關文章
- js精確計算浮點數相加JS
- javascript浮點數精確計算程式碼JavaScript
- JavaScript浮點數加減乘除精確計算JavaScript
- python中精確的浮點數運算Python
- 在Java中實現浮點數的精確計算 (轉)Java
- 為什麼php的浮點數運算不準確PHP
- js精確比較浮點數大小JS
- 關於PHP精確計算模組PHP
- Java浮點數計算Java
- Java浮點數float,bigdecimal和double精確計算的精度誤差問題總結JavaDecimal
- 一個浮點數計算的問題
- js中浮點數計算常用方法JS
- 浮點數線上轉hex計算工具
- php 處理 浮點數 精度運算 數字處理等PHP
- js處理浮點數計算誤差JS
- 浮點數在計算機底層的表示及運算計算機
- 面試官瘋了嗎,問我為什麼浮點數不精確?面試
- 計算機中的浮點運算計算機
- Redis 精確去重計數 —— 咆哮點陣圖Redis
- 計算機組成原理浮點數加減計算機
- javascript浮點數計算精度問題介紹JavaScript
- Java如何正確比較浮點數Java
- 深入理解浮點數的運算
- 計組之資料運算:9、浮點數的表示
- Oracle如何精確計算row的大小Oracle
- 有關 PHP 和 js 浮點運算的坑PHPJS
- 圖解計算機中的數值範圍和浮點運算圖解計算機
- 為什麼計算機對浮點型數字計算存在誤差計算機
- 計算機組成與體系結構-數值表示範圍-浮點數計算計算機
- JavaScript解決浮點數算數運算精度問題JavaScript
- 二進位制轉float浮點數線上計算工具
- 關於JS的浮點數計算精度問題解決方案JS
- 浮點數的加減乘除運算細節
- Java 浮點數精確性探討(IEEE754 / double / float)與 BigDecimal 解決方案JavaDecimal
- PHP基礎教程-09 浮點型變數PHP變數
- 計算機組成與體系結構-浮點數表示計算機
- 浮點數
- 浮點數的理解