PHP中浮點數計算比較及取整不準確的解決方法_php基礎
浮點數計算結果比較
一則浮點數計算範例如下:
$a = 0.2 0.7;
$b = 0.9;
var_dump($a == $b);
印出的結果是:bool(false)。也就是說這裡 0.2 0.7 的計算結果與 0.9 並不相等,這顯然是有違我們的常識的。
對此問題,PHP官方手冊曾又說明:顯然簡單的十進制分數如 0.2 不能在不丟失一點點精度的情況下轉換為內部二進制的格式。這和一個事實有關,那就是不可能精確的用有限位數來表達某些十進制分數。例如,十進制的 1/3 變成了 0.3333333...。
我們將上面的變數以雙精確度格式列印出來:
$a = 0.2 0.7;
$b = 0.9;
printf("%0.20f", $a);
echo '
';
printf("%0.20f", $b);
輸出結果如下:
0.89999999999999991118
0.90000000000000002220
顯然在這裡,實際上作為浮點型數據,其精度已經損失了一部分,達不到完全精確。所以永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。需要說明的是,這不是PHP的問題,而是電腦內部處理浮點數的問題!在 C、JAVA 等語言中也會遇到同樣的問題。
所以要比較兩個浮點數,需要將其控制在我們需要的精度範圍內再行比較,因此使用bcadd() 函數來對浮點數想加併進行精度轉換(為字串): p>
var_dump(bcadd(0.2,0.7,1) == 0.9); // 輸出:bool(true)
浮點數取整
在《PHP 取整函數 ceil 與 floor》一文中,曾有例子:
echo ceil(2.1/0.7); // 輸出:4
?>
經過上面對浮點數計算的探討,知道這是浮點數計算結果不完全精確造成的:
printf("%0.20f", (2.1/0.7)); // 輸出:3.00000000000000044409
?>
經過上面對浮點數計算的探討,知道這是浮點數計算結果不完全精確造成的,因此使用 round() 函數處理一下即可:
echo ceil( round((2.1/0.7),1) );
?>
雖然 round() 函數是依照指定的精確度進行四捨五入,但保留小數點後一位,對我們的取整結果是沒影響的。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP 是一門功能強大的程式語言,廣泛應用於 Web 開發領域。其中一個非常常見的情況是需要將字串轉換為小數。這在進行資料處理的時候非常有用。在本文中,我們將介紹如何在 PHP 中將字串轉換為小數。

這篇文章將為大家詳細講解有關PHP浮點數四捨五入法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。 PHP浮點數四捨五入法概述浮點數在計算機中表示為小數點後跟指數,然而,它們通常以有限位數的近似值存儲。當需要將浮點數四捨五入到特定精度時,有幾種方法可以實現。方法1.round()函數round()函數將浮點數四捨五入為最接近的整數。它接受浮點數和可選的精度參數。例如:$num=1.55;echoround($num);//輸出:2echoround($num,1)

使用strconv.FormatFloat函數將浮點數轉換為字串在Go語言中,我們經常需要將浮點數轉換為字串類型,用於輸出或儲存等需求。 Go語言中提供了strconv包,其中的FormatFloat函數可以將浮點數轉換為字串類型。 FormatFloat函數有三個參數:f表示要轉換的浮點數,fmt表示格式,以及prec表示要保留的小數位數。其中,f參數

PHP作為一種流行的伺服器端腳本語言,在進行浮點數計算時常常會遇到精確度遺失或計算誤差的問題,這些問題可能會對程式的準確性和穩定性造成影響。本文將探討PHP浮點數計算誤差的原因,並提出一些避免策略,同時給予特定的程式碼範例供參考。 1.PHP浮點數計算誤差的原因在計算機中,浮點數是以二進制形式表示的,而二進制並不能精確地表示所有的十進制小數,這就導致了浮點數的精

隨著電腦程式設計的發展,我們在日常程式設計工作中可能會遇到需要進行除法運算並取整的場景。而在PHP程式設計中,我們可以使用不同的方法來達成這個目的。

:一、BCMath簡介BCMath是PHP內建的擴充庫,專門用來處理大型整數和浮點數運算。它提供了豐富的函數來進行加、減、乘、除、平方、開方等各種數學運算,並且支援多種進制的數字表示。二、BCMath的優勢BCMath相較於php原生提供的算術運算子和函數,主要有以下幾個方面的優勢:精度更高:BCMath的運算結果可以保留更多的有效數字,這對於涉及大數計算的場景尤其重要。範圍更廣:BCMath可以處理比PHP原生資料類型更大的數字,從而避免溢出或精度遺失的問題。功能更豐富:BCMath提供了

將字串轉換為浮點數是在PHP中常見的操作,可以透過內建的方法來實現。首先要確保字串是合法的浮點數格式,才能成功轉換為浮點數。以下將詳細介紹如何在PHP中將字串轉換為浮點數,並提供具體的程式碼範例。一、使用(float)強制轉換在PHP中,將字串轉換為浮點數最簡單的方式就是使用強制轉換。強制轉換的方式是在字串前加上(float)即可,PHP會自動將其

使用C#中的Math.Round函數對浮點數進行四捨五入,需要具體程式碼範例在C#程式語言中,有時我們需要對浮點數進行四捨五入操作。這時,我們可以使用Math.Round函數來實現此功能。 Math.Round函數是C#中一個用於數學計算的內建函數,其主要功能是對指定的浮點數進行四捨五入。以下是Math.Round函數的常用格式:Math.Round(doub
