mysql:6675
From: Masahiro Utsumi <Masahiro Utsumi <utsumi@xxxxxxxxxx>>
Date: Sat, 07 Dec 2002 13:42:51 +0100
Subject: [mysql 06675] Re: ROUND 関数の四捨五入について
内海@通りがかりのものです。 過去のやり取りを良く見てないのではずしているかもしれませんが・・ Banker's Round(銀行での四捨五入のやり方)の問題ではないでしょう か? .5の場合近いほうの偶数に丸める方式です。利息計算で算術四捨 五入をすると確率的に合計が大きくなる傾向があるので、それを補正す る手段です。 下のソース説明では奇数に丸まっているので違う問題か もしれませんね。 参考: http://support.microsoft.com/default.aspx?scid=kb;en-us;Q28855 はずしていたらごめんなさい。 > みやがわです。 > > > これはMySQLが内部的に行っている(のかな?)処理に原因があるので > > しょうか? > > もしくは、適さないフィールドの型とかがあるのでしょうか? > > 参考になればといった程度なのですが・・・・。 > > 原因としてはROUNDの実装問題ではないかと思われます。 > Item_func.cppで > Item_func_roundと言うメソッドが定義されています。 > ROUND関数の実装部分のようなのですが、関数内で > > config-win.hのヘッダにある > inline double rint(double nr) > { > double f = floor(nr); > double c = ceil(nr); > return (((c-nr) >= (nr-f)) ? f :c); > } > > を呼んでいます。 > たとえば nr 845.5 の場合に > f 845 > c 846 > となり、本来ならば return でcの846を返すべきところが > fの845を戻す作りになっているからだと思います。 > > 「>=」でなく 「>」 にすればいいものなのでは、と思いますが。 > ただ、ソースを見ただけの話なので、確証はありませんが・・・。 > > 他のOSの場合には > #define rint(A) floor((A)+0.5) > で行っているようです。なぜ、windowsだけ違うかの理由はわかりません。 > > また、修正されていない理由等は、自分にもわかりません。 > > ---- > Takeyuki Miyagawa miyagawa@xxxxxxxxxx
6667 2002-12-05 19:38 ["matsuda" <matsuda@x] ROUND 関数の四捨五入について 6668 2002-12-05 23:59 ┣[KAWAJI Shinya <kawaj] 6669 2002-12-06 00:08 ┃┗[KAWAJI Shinya <kawaj] 6671 2002-12-06 19:59 ┗[Takeyuki Miyagawa <m] -> 6675 2002-12-07 21:42 ┣[Masahiro Utsumi <uts] 6676 2002-12-09 00:43 ┗["kossy" <kossy@xxxxx] 6677 2002-12-09 13:23 ┗["matsuda" <matsuda@x]