ホームページ >バックエンド開発 >PHPチュートリアル >PHP のフロア関数に関する問題
PHPフロア関数の問題。
$money=271.28;echo $money=floor($money*pow(10,2))/100出力が 271.28 ではなく、271.27 だったことに驚きました!
後でいろいろ調べてみたら、php 公式サイトにこれがありました:
浮動小数点数の精度には限界があります。10 進数で正確に表現できる有理数は、0.1 などです。 0.7 は、仮数の数に関係なく、内部で使用されるバイナリでは正確に表現できないため、精度を少し損なうことなくバイナリ形式に変換することはできません。これは混乱を招く結果につながる可能性があります。たとえば、floor((0.1+0.7)*10) は通常、代わりに 7 を返します。 8 が期待されます。結果の内部表現は実際には 7.9999999999999991118... に似ているためです。 したがって、浮動小数点数の結果が最後の桁まで正確であるとは絶対に信じないでください。また、2 つの浮動小数点数が等しいかどうかを比較することも決してしないでください。
後で上記の操作の結果を出力しました:
printf("%.12f", $money*pow(10,2));結果は次のとおりです: 27127.999999999996
精度の問題だったことが分かりました。統一された解決策はまだ見つかっていません。 2 桁まで正確なデータの再処理を避けるために、コード ロジックに
if ($money - round ( $money, 2 ) < 0.00001) {}else{$money=floor($money*pow(10,2))/100;}を追加することしかできません。
上記の関数を実装する別の方法 (小数点以下 2 桁まで正確で 3 桁目は切り捨てる) を知っている人がいたら、私に知らせてください。