私は現在、金融に関するプロジェクトを書いています。小数に関する問題がたくさん含まれています。以前、floor を使って小数点第 2 位まで切り捨てたとき、突然、次のコードが異常であることに気づきました。
$money=271.28;
echo $money=floor($money*pow(10,2))/100
ログイン後にコピー
出力が 271.28 ではなく 271.27 だったことに驚きました
その後、多くの情報を確認し、php 公式 Web サイトで次のことを確認しました:
浮動小数点数の精度には限界があります、can 0.1 や 0.7 などの有理数は、仮数の数に関係なく、内部で使用されるバイナリでは正確に表現できないため、バイナリ形式に変換すると、ちょっとした精度。これは、混乱を招く結果につながる可能性があります。たとえば、floor((0.1+0.7)*10) は、通常、期待される 8 の代わりに 7 を返します。これは、結果の内部表現が次のとおりであるためです。実際には 7.99999999999999991118... に似ています。 したがって、浮動小数点数の結果が最後の桁まで正確であるとは決して信じないでください。また、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 桁目は切り捨てる) を知っている人がいたら、私に知らせてください。
上記は、PHP の Floor 関数の問題を紹介しました。 、関連コンテンツも含めて、PHP チュートリアルに興味のある友人に役立つことを願っています。