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() 函数来对浮点数想加并进行精度转换(为字符串):
复制代码 代码如下:
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脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++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提供了

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

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