Microsoft SQL Server の FLOOR 関数の動きが変。
例えば、DBに「返金 20,244,233円」という情報があり、これは返金なのでマイナス金額にした上で、返金額の税抜金額を計算する処理がある。
「返金 1,100円」なら -1.100円にした上で 1.1 で割って税抜 -1,000円を算出。返金 -1,100円からこの -1,000円を引いて -100円が消費税・・・のような計算をしている。
この際、端数は「0円からマイナス方向へ遠い値で切り捨てる(切り下げ)」ことになっている。「返金 126円」なら -126 / 1.1 で -114.54545 だから -115 となる。税抜が -115円で、消費税が -11円である。
ちなみに、この計算方法の是非についてはこの場で議論はしない。こういうルールで動いているのだからそれでいいのだ。
で、切り下げをする関数 FLOOR の動きがなんか変。
「返金 20,244,233円」の場合、
SELECT FLOOR(20244233 * -1 / 1.1) AS R
という SQL で R に -18,403,848.18 を切り下げた -18,403,849 が返ってきて、税抜 -18,403,849 で消費税 -1,840,384 となってほしい。
ところが、上記の SQL の結果は、R が -18,403,830 となる。19円も値がずれている。
しかし、元の数値をマイナスにするタイミング(-1 をかける)を変えるだけで、正しい数値が戻ってくる。
SELECT FLOOR(20244233 / 1.1 * -1) AS R
だと、R列は -18,403,849 になる。
FLOOR に食わせる数値は()内で計算しているので、-1 するタイミングが前後しても関係ないと思うんだが・・・
ちなみにこれ、数字が大きい分だけ誤差も大きくなる。-1,000,000なら 1円ずれるが、-10,000,000 なら 10円ずれる。
使えねえなあ、FLOOR 関数。内部的に桁落ちしちゃってる???
ネット上を探してみたけど、「これこれこういう理由でずれる」という説明は見つけることができなかった。
「こういう使い方をしたらずれますよ」って情報は、メーカーとしてちゃんと提示しておくべきではないんかいな、マイクロソフトさんよお(^^;
コメントする