7434 小数部分を切り捨てて整数値を得る関数 はくぶん 2019-09-01 00:04:03
普段は一応SE兼PGなので、たまにはプログラム的な話題も少し。
自分にとっては、備忘録代わりに記しておきたいと思う。

どんなプログラム言語にも、小数部分を切り捨てて整数にする関数がある。
自分はどちらかと言うとスクリプト系の言語を使うことが多いが、その中で要注意な言語がある。

PHPにはIntval関数がある。
PerlにはInt関数がある。
VBScriptには、なんとInt関数とFix関数という2つの関数がある。

それぞれに5.31を代入してみる。
PHP:Intval(5.31) 結果:5
Perl:Int(5.31) 結果:5
VBScript:Fix(5.31) 結果:5
VBScript:Int(5.31) 結果:5

どれも小数部分の0.31が切り捨てられて、整数の5が返って来る。

ん?別にどれも同じじゃないか。
一体どこが要注意なんだ?
そう、ここまでは問題ないのだ。
問題は次である。

次にそれぞれの関数に-5.31を代入してみる。
PHP:Intval(-5.31) 結果:-5
Perl:Int(-5.31) 結果:-5
VBScript:Fix(-5.31) 結果:-5
VBScript:Int(-5.31) 結果:-6

見ての通り、1つだけ-6という想定外の結果が返って来る。

確かにちょっと考えれば、どういう処理をしているのか分からないでもない。
使い方によっては便利に働く時もあるだろう。
しかし、この関数名でこの結果は、ちょっと危険過ぎやしないか?

ほぼ全ての人間は、-5.31の整数値として-5を想定しているだろう。
-5.31の整数値として-6を必要とする場合は無いと言っても過言ではない。
関数名としてあまり馴染みのないFix関数の結果が-6になるのなら、まだそれ程危険はないのかもしれない。
しかし、他のスクリプト言語では-5となるInt関数で-6になるのは、ちょっと危険度が高過ぎるだろう。
マイクロソフトは、なぜそういう選択をしたのだろうか?

いずれにせよ、これは絶対に覚えておかなければならない例外である。

VBScriptは、Windowsマシンを使っている人間にとって、手軽に使える便利なスクリプト言語である。
しかも、小数部分を切り捨てて整数値を得るなどという処理は、日常的によく使われる。
そんな手軽な言語の、そんな日常的な処理に、こんな大きな落とし穴がある。

是非とも気を付けてもらいたいものである。
と同時に、自分に対して注意を喚起するためにも、ここにこれを記しておく。


8月が終わり9月になった。
いつの間にか、外では秋の虫が鳴いている。
今夜は非常に涼しい。
夏が終わったことを、幾重にも告げているようだ。
メッセージ文字数:1099/1153