ホームページ >バックエンド開発 >PHPチュートリアル >FLOATを2つ足し合わせると不思議な現象が起きる~解決策のアイデア

FLOATを2つ足し合わせると不思議な現象が起きる~解決策のアイデア

WBOY
WBOYオリジナル
2016-06-13 13:47:581951ブラウズ

FLOAT を 2 つ追加すると奇妙な現象が発生します~~~~

PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
list ( $usec, $sec ) = explode ( ' ', microtime () );

printf("秒:%.16f", (float)$sec);
printf("微秒:%.16f", (float)$usec);
printf("相加:%.16f", ( float ) $usec + ( float ) $sec);


出力結果は次のとおりです:
Seconds: 1327048300.0000000000000000
Microseconds: 0.9687510000000000
追加: 1327048300.9687509536743164

浮動小数点数が近似値であることはわかっていますが、$usec を出力して小数点以下 16 桁を保持すると、小数点がありません。そうすると、1327048300と等しいと考えられないでしょうか?
2 つの合計が 1327048300.9687510000000000 にならないのはなぜですか? ?

ありがとうございます! !

-----解決策---------
警告
浮動小数点精度
0.1 や 0.7 などの一見単純な小数は、精度を少し損なうことなく内部バイナリ形式に変換できません。これは、混乱を招く結果につながる可能性があります。たとえば、floor((0.1+0.7)*10) は、結果の内部表現が 7.9999999999... のようなものであるため、通常、期待される 8 ではなく 7 を返します。
これは、有限の桁数で特定の小数を正確に表現することが不可能であるという事実に関連しています。たとえば、10 進数の 1/3 は 0.3333333 になります。

したがって、浮動小数点数の結果が最後の桁まで正確であるとは絶対に信じないでください。また、2 つの浮動小数点数が等しいかどうかを比較しないでください。本当に高い精度が必要な場合は、任意精度の数学関数または gmp 関数を使用する必要があります。
------解決策----------------------
有効な番号が何なのかさえわかりませんあなたの両親がなぜそんなにお金をかけてあなたを大学に行かせるのか本当に理解できません
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。