2016-09-12 22 views
0

私はPHP 5.5を使用していますが(5.5.28) 私はPHP演算で本当に奇妙な問題に遭遇してきたPHP演算エラー - モジュロ

$value=29; $divisor=10; 
$mod=$value%$divisor; 
echo "$mod<br>"; 

戻り9(予想通り)

$value=(0.29*100); $divisor=(0.1*100); 
$mod=$value%$divisor; 
echo "$mod<br>"; 

012(返信)

私はこの文書では何も見つかりません 明らかにその置換機能を書いて比較的簡単に使用してください しかし、私が作業しているプロジェクトの元帳が均衡していないことを意味する奇妙な丸め誤差が発生しているので、問題はより大きくなるように思われる

何か提案がありますか?

+6

[読む、学ぶ、内向きにダイジェスト](https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems)、および[このPHP Docsページの大きな警告メッセージを読んでください](http://php.net/manual/en/language.types.float.php)....もしあなたが元帳を書いているなら、精度___any___プログラミング言語の浮動小数点数は、常に整数を使用 –

+0

ありがとうマーク...私の純粋な意味が当てはまると仮定して純粋ではない – user3600150

+2

*共通S ense?*無限大の10進値を固定数のバイナリバイトに格納できない理由があります。関係するページにアクセスすると大きな警告が表示されます。 –

答えて

2

浮動小数点数が格納される方法とほぼ同じですが、.29 * 100が29と0.1に完全に等しくない問題があります* 100は正確に10には等しくありません。あなたが予想していたよりも少し小さいか大きいです。小数点第10位を中間値として出力すると、おそらく原因を確認することができます。

これは、浮動小数点の均等性を比較しようとしたときと全く同じ問題です。if (a == b)