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 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP は、Web 開発の分野で広く使用されている強力なプログラミング言語です。非常に一般的な状況の 1 つは、文字列を 10 進数に変換する必要があることです。これはデータ処理を行うときに非常に便利です。この記事では、PHPで文字列を10進数に変換する方法を説明します。

この記事では、PHP の浮動小数点数の四捨五入方法について詳しく解説しますが、非常に実践的だと編集者が考えたので、参考として共有しますので、この記事を読んで何かを得ることができれば幸いです。 PHP 浮動小数点丸めの概要 コンピュータでは、浮動小数点数は小数点とそれに続く指数として表されますが、多くの場合、限られた桁数の近似値で格納されます。浮動小数点数を特定の精度に丸める必要がある場合、それを行う方法がいくつかあります。方法 1.round() 関数round() 関数は、浮動小数点数を最も近い整数に丸めます。浮動小数点数とオプションの精度パラメータを受け入れます。例: $num=1.55;echoround($num);//出力: 2echoround($num,1)

strconv.FormatFloat 関数を使用して、浮動小数点数を文字列に変換します。Go 言語では、出力またはストレージのニーズに応じて、浮動小数点数を文字列型に変換する必要がよくあります。 strconv パッケージは Go 言語で提供されており、その中の FormatFloat 関数は浮動小数点数を文字列型に変換できます。 FormatFloat 関数は 3 つのパラメータを取ります。f は変換される浮動小数点数を表し、fmt は形式を表し、prec は保持する小数点以下の桁数を表します。このうち、fパラメータは

コンピューター プログラミングの発展に伴い、日常のプログラミング作業で除算や四捨五入を実行する必要があるシナリオに遭遇することがあります。 PHP プログラミングでは、この目的を達成するためにさまざまな方法を使用できます。

人気のサーバーサイド スクリプト言語である PHP では、浮動小数点計算を実行するときに精度の低下や計算エラーの問題が頻繁に発生し、プログラムの精度と安定性に影響を与える可能性があります。この記事では、PHP 浮動小数点計算エラーの原因を調査し、いくつかの回避戦略を提案し、参考として具体的なコード例を示します。 1. PHP 浮動小数点計算エラーの理由 コンピューターでは、浮動小数点数は 2 進数形式で表現されますが、2 進数ではすべての 10 進数を正確に表現できないため、浮動小数点数が不正確になります。

:1. BCMath の概要 BCMath は、PHP に組み込まれた拡張ライブラリであり、特に大きな整数および浮動小数点数の演算を処理するために使用されます。加算、減算、乗算、除算、平方、平方根などのさまざまな数学演算を実行するための豊富な関数を提供し、複数の基底でのデジタル表現をサポートします。 2. BCMath の利点 PHP がネイティブに提供する算術演算子や関数と比較して、BCMath には主に次の利点があります: 高精度: BCMath の演算結果はより多くの有効桁数を保持できるため、大きな数値を含む計算に役立ちます。より広い範囲: BCMath は、PHP のネイティブ データ型よりも大きな数値を処理できるため、オーバーフローや精度の低下の問題を回避できます。より豊富な機能: BCMath が提供する

C# で Math.Round 関数を使用して浮動小数点数を丸めるには、特定のコード例が必要です。C# プログラミング言語では、浮動小数点数を丸める必要がある場合があります。現時点では、Math.Round 関数を使用してこの機能を実現できます。 Math.Round 関数は、数学的計算に使用される C# の組み込み関数であり、その主な機能は、指定された浮動小数点数を四捨五入することです。 Math.Round 関数の一般的な形式は次のとおりです。 Math.Round(doub

文字列を浮動小数点数に変換するのは PHP の一般的な操作であり、組み込みメソッドを使用して実行できます。文字列を浮動小数点数に正常に変換するには、まず文字列が有効な浮動小数点形式であることを確認してください。以下では、PHP で文字列を浮動小数点数に変換する方法を詳しく説明し、具体的なコード例を示します。 1. (float) キャストを使用する PHP で文字列を浮動小数点数に変換する最も簡単な方法は、キャストを使用することです。強制的に変換するには、文字列の前に (float) を追加します。これにより、PHP が自動的に変換します。
