切り上げ、切り捨て

Read More

切り上げ、切り捨てについて。


切り上げとは小数点以下のものを0にし、一つ上の位の数を繰り上げることを言う。

切り捨てとは小数点以下のものをちょん切ることを言う。


うむ、確か小学生の時にそう習った。



--
それを踏まえて以下をみて欲しい。


PHPで切り捨てを行うにはfloor()を使えば良い。


例えば3.5という数値に対して切り捨てを行いたい場合は、

■3.5への切り捨て
<?php
$val = 3.5;
echo floor($val);
?>



■実行結果
> 3



ふむ、普通だの。



では今度は負数に対して切り捨てを行ってみる。


-5.5という数値に対して切り捨てを行った場合

■-5.5への切り捨て
<?php
$val = -5.5;
echo floor($val);
?>



■実行結果
> -6




あれ????



-6???



-5じゃなくて-6??








ええええええええええええええええ!

まじすっかー


-5.5の切り捨てって-5なんじゃねーの?!



ってちょっと待て。


excelなんかだと切り捨てってrounddown()だったよなあ…

floor()って床って意味だよなあ…



wikiで調べてみた。

切り捨て・切り上げに準ずる丸めは、4種類ある。それぞれ「○○への丸め」と呼ばれる。

符号を無視して絶対値を丸める場合、切り捨ては、常に0へ近づく(または変わらない。以下では省略)ので「0への丸め (rounding toward zero; RZ)」、切り上げは、常に数直線上の無限遠点へ近づくので、「無限大への丸め (rounding toward infinity; RI)」と呼ばれる。単に切り捨て・切り上げというと、これらをさす。

逆に、正の数の場合と増減を同じ向きにする場合は、切り捨ては、常に減るので「負の無限大への丸め (rounding toward minus infinity; RM)」、切り上げは、常に増えるので「正の無限大への丸め (rounding toward plus infinity; RP)」と呼ばれる。
†wikipedia 端数処理 より引用
http://ja.wikipedia.org/wiki/%E7%AB%AF%E6%95%B0%E5%87%A6%E7%90%86#.E5.88.87.E3.82.8A.E6.8D.A8.E3.81.A6.E3.83.BB.E5.88.87.E3.82.8A.E4.B8.8A.E3.81.92



なるほど、昔習ったのは「0への丸め」というやつで、
PHP関数のfloor()は「負の無限大への丸め」というやつだったんだ。


floor()を使う数値の計算の時はこの事をよく覚えておかないといつかとんでもないことになりそうだ。



いやーびっくりびっくり。






--
ちなみに料金計算などでは、消費税の計算で小数点が嫌でも絡んでくるんだけど、
物の最小単位ごとに消費税を計算し、その都度端数を切り捨てることで、
客に対しての「取り過ぎ」ということを回避することができる。


例えばA商品=200円のときA商品を5つ買った場合の計算は、
1、
200円の商品1つに対しての消費税計算を行う。
つまり200*1.05=210

2、
1で出た答えに対して切り捨てを行う。
つまり210のまま。


3、
210の商品が5個なので
210*5=1050
となる。



このようなピッタリの場合は差がわからないけど、
B商品=176円の時B商品を5つ買ったとしたらどうだろうか。

上記の計算式だと、
(176*1.05)=184.8

184.8の端数切り捨てで184

184*5=920
となる。


一方で消費税の順序を一番最後にすると
(176*5)=880

880*1.05=924

924の端数切り捨てで変わらず924
となり、その差がハッキリ出てくる。



しかしB商品5つが1つのセットの商品Cとしての販売なら、課税はC商品のみとなるので計算も変わってくる。




今でこそ商品毎に内税込みの金額表示が課せられるようになったが、
その昔はこの点が曖昧で苦労した。