Hatena::ブログ(Diary)

分室の分室 このページをアンテナに追加

2012-03-21 Wed

【217】 端数処理の覚書

 読書中の『10日で覚える JavaScript』は Lesson 10, 11 (p.95)までさらっと
流し読みした。まだ、エレガントなコードを書けるところまでは達していない。

 JavaScript 一辺倒では、さすがに飽きてきたので、今日はちょっとだけ脱線
してみる。


 前回、

    【物流センター(倉庫)の在庫管理】
     スタッフ用:仕分け、ピッキング、出荷作業用の検品用チェックシート

なるものを、途中まで作った。で、その続きをやるには『端数処理』を行う必要
があるので、ちょっとメモ。


 JavaScript では、次のメソッドを使えば簡単らしい。

    Math.round()    四捨五入
    Math.floor()    切り捨て
    Math.ceil()     切り上げ

 これは『JavaScript ポケットリファレンス』で調べた。やっぱ『逆引きリファ
レンス』の本は便利だ。さっそく試してみる。



<pre>
<script type="text/javascript">
<!--
var data = [3.4, 3.5, 3.04, -3.4, -3.5, -3.6, -3.04];
var num  = data.length;
for (var i=0; i<num; ++i){

document.writeln("4捨5入(" + data[i] + ") => " + Math.round(data[i])); document.writeln("切捨て(" + data[i] + ") => " + Math.floor(data[i])); document.writeln("切上げ(" + data[i] + ") => " + Math.ceil(data[i])); document.writeln(""); } // --> </script> </pre>  実行したら、こうなった。↓ 4捨5入(3.4) => 3 切捨て(3.4) => 3 切上げ(3.4) => 4 4捨5入(3.5) => 4 切捨て(3.5) => 3 切上げ(3.5) => 4 4捨5入(3.04) => 3 切捨て(3.04) => 3 切上げ(3.04) => 4 4捨5入(-3.4) => -3 切捨て(-3.4) => -4 切上げ(-3.4) => -3 4捨5入(-3.5) => -3 ← ? 切捨て(-3.5) => -4 切上げ(-3.5) => -3 4捨5入(-3.6) => -4 ← ? 切捨て(-3.6) => -4 切上げ(-3.6) => -3 4捨5入(-3.04) => -3 切捨て(-3.04) => -4 切上げ(-3.04) => -3  意外だったのは、切り捨てと切り上げが、負数でもちゃんとしてること。それ なのに、なぜか『負数の四捨五入』が、なんか納得できない結果に…。 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 ←|→ | ←|→ | -+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+  数直線で見れば、明らかに -5捨-4入 になって然るべきだと思うんだけど…。  例えば、Perl で四捨五入をやるなら、たぶんこうすると思う。↓
#!/usr/bin/perl my @data = (3.4, 3.5, 3.04, -3.4, -3.5, -3.6, -3.04); for (my $i=0; $i<@data; ++$i) { my $flag = ($data[$i] < 0) * -1 + ($data[$i] >= 0); # 論理式(1 or -1) print "4捨5入($data[$i]) => ", int($data[$i] + 0.5 * $flag), "\n"; } __END__

 実行結果。↓ c:\usr\edit\test-lib\gmcl>round_test.pl 4捨5入(3.4) => 3 4捨5入(3.5) => 4 4捨5入(3.04) => 3 4捨5入(-3.4) => -3 4捨5入(-3.5) => -4 4捨5入(-3.6) => -4 4捨5入(-3.04) => -3  ただ、 Perl で切り上げ、切り捨てをやるのは、逆に JavaScript より面倒に なるんだな…。だから、そっちは省いた。基本的に、切り捨て、切り上げという のは、『正の実数』限定の話題だと思っているので。。。  今回はこれでおしまい。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/foussin/20120321/1332259174