これなんてバグ?四捨五入と思ってたら・・・ [AppleScript辞書はつくれるか?]
Apple Script には数値を丸めるコマンドがあります。
round (|数値|)
日本には四捨五入という計算方法がありますが、
Round文は、少し違うところで切り捨て切り上げをしているようです。
それについてちょっと気になることがありましたので実際に計算してみました。
こんなスクリプトを作ってみた。
set s to "" & return
set a to 0.0
repeat with i from 1 to 50
(* イ) 合計の実数に、0.1(実数)づつ足していき、round文を使う *)
set a to a + 0.1
set b to round (a)
(* ロ) 1~30の整数を10(整数)で除算し、round文を使う *)
set c to i / 10
set d to round (c)
(* ハ) 1~30の整数を10(実数)で除算し、round文を使う *)
set e to i / 10.0
set f to round (e)
(* 二) 0.1~3.0(実数)を10.0(実数)で除算し、round文を使う *)
set g to i * 1.0 -- | あらかじめに実数化しておく 例 12 => 12.0 |
set h to g / 10.0
set j to round (h)
set s to s & tab & (a as text) & " => " & (b as text) & " "
set s to s & tab & (c as text) & " => " & (d as text) & " "
set s to s & tab & (e as text) & " => " & (f as text) & " "
set s to s & tab & (h as text) & " => " & (j as text) & return
end repeat
イ)~ 二)まで全て 0.1 ~ 5.0 の数字を発生させ Round文で丸めているというもの。
(図1)
まぁ、違いがあれどすべて同じ数字になるはず。 ・・・でした。
何だろう 元数値の2.5の部分で『イ)』(一番左)と 『ロ)ハ)ニ)』(右の3つ)で誤差が出てきてしまっているのです。なぜ?
さらにお気づきの方もいらっしゃると思いますが、
0.5 => 0(切捨)
1.5 => 2(切上げ)
2.5 => ?(切捨?)
3.5 => 4(切上げ)
4.5 => 4(切捨)
と滅茶苦茶なんです。
これはどういうことなのか?
ググってみたらありました。
『Jis丸めとは?』> http://homepage1.nifty.com/s_miyake/hp/jisround.htm
ざっと搔い摘むと、すぐ上の桁が『偶数だと5は切捨て↓』『奇数だと5は切上げ↑』というJIS規格があるということでしょうか?
う~ん、難しい。
とりあえず、
Round文を『四捨五入』または、『五捨六入』だと思って使ってる人がいましたら、今すぐ使用をやめた方が良いでしょう。
では、四捨五入はどうすれば良いかというと、
A)
my Rounding_off(|数値|)
on Rounding_off(ans)
if ans < 0 then
set flg to -1
absNum(ans)
else
set flg to 1
end if
if ((ans mod 1) < 0.5) then
set _res to (ans div 1)
else
set _res to ((ans div 1) + 1) * flg
end if
return _res
end Rounding_off
(* または *)
B)
set _res to round ans rounding as taught in school
と記述するのが良いようです。
まぁ、Bの方がかんたんやね。
コメント 0