php浮點數精度警告

2021-09-01 17:45:53 字數 1030 閱讀 2334

先出道題:

<?php

echo intval(( (0.1+0.7) * 10 ));

?>

會輸出多少?8?7!

在講為什麼前先再重溫一下php的int

整型(integer)的形式描述: 

decimal : [1-9][0-9]*

| 0hexadecimal : 0[xx][0-9a-fa-f]+

octal : 0[0-7]+

integer : [+-]?decimal

| [+-]?hexadecimal

| [+-]?octal

自 php 4.4.0 和 php 5.0.5後,最大值可以用常量php_int_max來表示。

<?php

var_dump(01090); // 八進位制 010 = 十進位制 8

?>

如果向八進位制數傳遞了乙個非法數字(即 8 或 9),則後面其餘數字會被忽略。

再來溫故一下float

浮點數的形式表示: 

lnum [0-9]+

dnum ([0-9]*[\.]) | ([\.][0-9]*)

exponent_dnum [+-]?(( | ) [ee][+-]? )

顯然簡單的十進位制分數如同 0.1 或 0.7不能在不丟失一點點精度的情況下轉換為內部二進位制的格式。這就會造成混亂的結果:例如,floor((0.1+0.7)*10)通常會返回 7 而不是預期中的 8,因為該結果內部的表示其實是類似 7.9。

這和乙個事實有關,那就是不可能精確的用有限位數表達某些十進位制分數。例如,十進位制的 1/3 變成了 0.3。

所以永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。如果確實需要更高的精度,應該使用任意精度數學函式或者 gmp 函式。

PHP手冊 關於浮點數精度的警告

以下第乙個按理會返回8結構是7 為什麼呢 int 0.1 0.7 10 7 int 0.1 0.6 10 7 查了php手冊發現如下,才了解 顯然簡單的十進位制分數如同 0.1 或 0.7不能在不丟失一點點精度的情況下轉換為內部二進位制的格式。這就會造成混亂的結果 例如,floor 0.1 0.7 ...

PHP 浮點數的精度

浮點數的精度有限。儘管取決於系統,php 通常使用 ieee 754 雙精度格式,則由於取整而導致的最大相對誤差為 1.11e 16。非基本數 算可能會給出更大誤差,並且要考慮到進行復合運算時的誤差傳遞。此外,以十進位制能夠精確表示的有理數如 0.1 或 0.7,無論有多少尾數都不能被內部所使用的二...

PHP浮點數運算精度問題

最近有客戶反應 訂單金額總是不準確,總是相隔一分錢。檢查相關 邏輯都是正確的,就是運用了四則運算。大概推測問題可能出在浮點計算丟失精度。在 php程式設計師雷雪松的部落格 中寫過一篇關於js精度不準確的文章 js中浮點數運算不精準 下面php程式設計師雷雪松詳細的介紹一下如何解決php浮點數運算精度...