ホームページ >バックエンド開発 >PHPチュートリアル >PHP のフロア関数に関する問題

PHP のフロア関数に関する問題

WBOY
WBOYオリジナル
2016-06-13 12:13:361013ブラウズ

PHPフロア関数の問題。



私は現在、金融に関するプロジェクトを書いています。小数に関する問題がたくさん含まれています。以前、floor を使って小数点第 2 位まで切り捨てたとき、突然、次のコードが異常であることに気づきました。

$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 桁目は切り捨てる) を知っている人がいたら、私に知らせてください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。