PHP浮動小数点数の精度問題のまとめ、PHP浮動小数点数の精度
1. PHP浮動小数点数の精度損失問題
まず次のコードを見てください:
コードをコピーします コードは次のとおりです:
$f = 0.57;
エコー間隔($f * 100); //56
結果は少し驚くかもしれませんが、PHP は IEEE 754 倍精度に従います。
浮動小数点数は、1 つの符号ビット (E)、11 の指数ビット (Q)、および 52 ビットの仮数ビット (M) (合計 64 ビット) を使用して、64 ビットの倍精度で表されます。
符号ビット: 最上位ビットはデータの符号を表し、0 は正の数を表し、1 は負の数を表します。
指数ビット: データが基数 2 乗されていることを示し、指数はオフセット コードで表されます
仮数部: データの小数点以下の有効数字を示します。
10 進数が 2 進数でどのように表現されるかを見てみましょう:
2を掛けて切り上げ、順番に並べます。つまり、小数部を2倍し、整数部を取り、残りの小数部を2倍し、整数部を取り、残りの小数部を2を計算して小数部の部分を取りますが、このように0.57のような小数を掛けると、小数部が0になることはありません。有効数字の10進表現は2進数では無限大です。
0.57 のバイナリ表現は基本的に (52 ビット): 0010001111010111000010100011110101110000101000111101
52 ビットしかない場合、0.57 => 0.56999999999999995
上記の予期せぬ結果を確認するのは難しくありません。
2. PHP浮動小数点数の精度の問題
まず質問を見てみましょう:
コードをコピーします コードは次のとおりです:
$f = 0.58;
var_dump(intval($f * 100)); //なぜ 57 が出力されるのですか
このような疑問を持ったことのある学生さんも多いと思います。
具体的な原理については、「Brother Bird」の記事で詳しい説明があります: PHP 浮動小数点数に関するよくある質問への回答
それでは、この問題を回避するにはどうすればよいでしょうか?
方法はたくさんありますが、ここでは 2 つ紹介します:
1.スプリント
コードをコピーします コードは次のとおりです:
substr(sprintf("%.10f", ($a/ $b)), 0, -7);
2.round(丸くなるので注意)
コードをコピーします コードは次のとおりです:
ラウンド($a/$b, 3);
または、より良い方法がある場合は、メッセージを残して教えてください。
3. PHP 浮動小数点数に関するよくある質問への回答
PHP の浮動小数点数については、以前に次の記事を書きました: PHP の float についてのすべての「偽り」 (PHP の float についてのすべての「偽り」)
しかし、私は次のよくある質問に対する答えを 1 つ見逃していました:
コードをコピーします コードは次のとおりです:
$f = 0.58;
var_dump(intval($f * 100)); //なぜ 57 が出力されるのですか
?>
出力が 57 になるのはなぜですか? PHP のバグですか?
bugs.php.net でよく質問されることは言うまでもなく、同様の質問をする人がたくさんいるので、多くの学生がそのような質問をしたことがあると思います...
この理由を理解するには、まず浮動小数点数の表現 (IEEE 754) を知る必要があります。
浮動小数点数は、64 ビット長 (倍精度) を例として、1 つの符号ビット (E)、11 の指数ビット (Q)、および 52 ビットの仮数ビット (M) で表されます (合計 64 ビット)。 .
符号ビット: 最上位ビットはデータの符号を表し、0 は正の数を表し、1 は負の数を表します。
指数ビット: データの累乗を基数 2 で表し、指数はオフセット コードで表されます
仮数: データの小数点以下の有効数字を示します。
ここで重要なのは、バイナリでの小数を表現する方法については、ここでは詳しく説明しません。0.58 は無限に長いということです。バイナリ表現 (以下の数字は暗黙の 1 を省略します)..
0.58 のバイナリ表現は基本的に (52 ビット): 0010100011110101110000101000111101011100001010001111
0.57 のバイナリ表現は基本的に (52 ビット): 0010001111010111000010100011110101110000101000111101
これら 52 ビットのみを使用して 2 つの 2 進数を計算すると、次のようになります。
コードをコピーします コードは次のとおりです:
0.58 -> 0.57999999999999996
0.57 -> 0.56999999999999995
具体的な浮動小数点の乗算0.58 * 100については、詳しくは考えませんので、興味のある方は暗算で見てみてください... 0.58 * 100 = 57.999999999
それでは、計算してみると、当然57になります…
この問題の重要なポイントは、「一見有限に見える 10 進数は、コンピューターの 2 進数表現では実際には無限である」ということです。
だから、これはもう PHP のバグだと思わないでください。これが実際のバグです…

まだ人気があるのは、使いやすさ、柔軟性、強力なエコシステムです。 1)使いやすさとシンプルな構文により、初心者にとって最初の選択肢になります。 2)Web開発、HTTP要求とデータベースとの優れた相互作用と密接に統合されています。 3)巨大なエコシステムは、豊富なツールとライブラリを提供します。 4)アクティブなコミュニティとオープンソースの性質は、それらを新しいニーズとテクノロジーの傾向に適応させます。

PHPとPythonはどちらも、Web開発、データ処理、自動化タスクで広く使用されている高レベルのプログラミング言語です。 1.PHPは、ダイナミックウェブサイトとコンテンツ管理システムの構築によく使用されますが、PythonはWebフレームワークとデータサイエンスの構築に使用されることがよくあります。 2.PHPはエコーを使用してコンテンツを出力し、Pythonは印刷を使用します。 3.両方ともオブジェクト指向プログラミングをサポートしますが、構文とキーワードは異なります。 4。PHPは弱いタイプの変換をサポートしますが、Pythonはより厳しくなります。 5. PHPパフォーマンスの最適化には、Opcacheおよび非同期プログラミングの使用が含まれますが、PythonはCprofileおよび非同期プログラミングを使用します。

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPは、多数のWebサイトとアプリケーションをサポートし、フレームワークを通じて開発ニーズに適応するため、近代化プロセスで依然として重要です。 1.PHP7はパフォーマンスを向上させ、新機能を紹介します。 2。Laravel、Symfony、Codeigniterなどの最新のフレームワークは、開発を簡素化し、コードの品質を向上させます。 3.パフォーマンスの最適化とベストプラクティスは、アプリケーションの効率をさらに改善します。

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境
