為什麼php的浮點數運算不準確
關於php浮點數,經常遇見預算不準確的情況
例子:
//例子
$a = 10.601;
$b = 10.6009;
echo $a- $b;
// 結果如下
0.00010000000000154
結果錯誤,why?
why
根本原因, 在某些情況下,
2 進位制無法精確表示 10 進位制的小數部分。
把 10 進位制轉化為 2 進位制,需要進行如下換換算,下面以10.601為例
- 整數部分
連續用該整數除以2,取餘數,然後商再除以2,直到商等於0為止。然後把得到的各個餘數按相反的順序排列。簡稱”除2取餘法”。
- 小數部分
連續用改小數乘以2,取整數部分,然後小數部分再乘以2,直到小數部分為0為止 。然後把取出的整數部分按順序排列。簡稱”乘2取整法”。
10 (整數部分)
10/2=5---------0
5/2=2----------1
2/2=1----------0
1/2=1----------1
(10) 10=(1010) 2
0.601 小數部分
0.601*2=1.202 ----1
0.202*2=0.404 ----0
0.404*2=0.808 ----0
0.808*2=1.616-----1
0.616*2=1.232-----1
0.232*2=0.464-----0
0.464*2=0.928-----0
......
(0.601)10 = (0.10011001......)2
我們發現會無限的迴圈下去,沒法精確用2進位制標識
php浮點數
浮點數,以64位的長度(雙精度)為例, 會採用 1 位符號位(E), 11 指數位(Q), 52 位尾數(M)表示
- 符號位:最高位表示資料的正負,0表示正數,1表示負數。
- 指數位:表示資料以2為底的冪,指數採用偏移碼錶示
- 尾數:表示資料小數點後的有效數字.
只能有52位儲存0.601部分,這樣大家就能看出原因了。
解決辦法
採用 “bc 資料函式” http://php.net/manual/zh/ref.bc.php
$a = 10.601;
$b = 10.6009;
//echo $a- $b;
echo bcsub($a , $b,4);
相關文章
- 浮點運算為什麼不準?有人為0.30000000000000004建了個網站網站
- PHP浮點數的精確計算BCMathPHP
- python中精確的浮點數運算Python
- 面試官瘋了嗎,問我為什麼浮點數不精確?面試
- 阿里巴巴為什麼建議使用BigDecimal進行浮點數運算阿里Decimal
- php 處理 浮點數 精度運算 數字處理等PHP
- 深入理解浮點數的運算
- js精確計算浮點數相加JS
- 為什麼計算機對浮點型數字計算存在誤差計算機
- 有關 PHP 和 js 浮點運算的坑PHPJS
- javascript浮點數精確計算程式碼JavaScript
- JavaScript解決浮點數算數運算精度問題JavaScript
- 浮點數的加減乘除運算細節
- JavaScript浮點數加減乘除精確計算JavaScript
- 徹底搞懂 PHP 變數結構體,多數文章觀點不準確PHP變數結構體
- 計算機中的浮點運算計算機
- 浮點數在計算機底層的表示及運算計算機
- Python做浮點數(float)運算要小心Python
- 在Java中實現浮點數的精確計算 (轉)Java
- 計組之資料運算:9、浮點數的表示
- 【轉】JS浮點數運算Bug的解決辦法JS
- 浮點運算簡介 (轉)
- 圖解計算機中的數值範圍和浮點運算圖解計算機
- 全面總結 JS 中浮點數運算問題JS
- JavaScript 浮點數及運算精度調整總結JavaScript
- float計算不準確的替代方法
- Java浮點數計算Java
- Python浮點數(小數)運算誤差的原因和解決辦法Python
- 3,javase程式碼實戰-運算子——更加精確的使用浮點數(二)Java
- Java如何正確比較浮點數Java
- js精確比較浮點數大小JS
- 為什麼說六西格瑪不僅僅是資料運算
- 浮點數之間的比較,基本運算這些究竟是怎麼實現的
- 一個浮點數計算的問題
- js中浮點數計算常用方法JS
- 浮點數線上轉hex計算工具
- 比特幣浮點運算速度64百億億次!比特幣
- mysql浮點型別是什麼MySql型別