[前][次][番号順一覧][スレッド一覧]

mysql:6671

From: Takeyuki Miyagawa <Takeyuki Miyagawa <miyagawa@xxxxxxxxxx>>
Date: Fri, 06 Dec 2002 19:59:34 +0900
Subject: [mysql 06671] Re: ROUND 関数の四捨五入について

みやがわです。

> これは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]