PHPを初めて、4年近くたちますがいまだに知らんことが多いですね(爆)
本日は、
1 2 3 4 5 |
<?php $a = 55/100; $b =100; $c = ceil($a*$b); echo $c //56 !? |
になるという非常にビックリな仕様に遭遇・・・
なにやら結構有名な仕様のようでどうやら2進数と10進数の変換でおこる誤差のようです。
そういやJavaでも似たような処理がありましたね。
私の場合気持ち悪いですが、割った数字をStringにキャスト変換して対応してしましました。
上記の例でいうと、下記のようなコードになります。
1 2 3 4 5 |
<?php $a = 55/100; $b =100; $c = ceil((String)($a*$b)); echo $c //55 |
そういや昔ECCUBEの中身を見たときの切り上げ、切捨て、四捨五入の処理はceilなどをそのまま使わずに+1したりとかをしてましたね・・・
参考リンク