質問 |
||
| 質問者:KURO_0720 | -3.34 が -3.3399999999999999 で表示される | |
|---|---|---|
困り度:
|
SQLServer2005でfloat型の項目に-3.34 を手入力(クエリアナライザでinsert文で入力した時も同様)して、コマンドプロンプトから以下のselect文を実行した所、-3.3399999999999999 で表示されました。 sqlcmd -U ユーザ名 -P パスワード -d データベース名 1> select * from テーブル名 クエリアナライザで同様に select * from テーブル名 した場合は、-3.34 のまま正しく表示されます。 -12.34、-22.34などの数値ではこの事象は発生せず、何か条件があるようです。お分かりになる方がいらっしゃいましたら、ご教示いただけないでしょうか? |
|
質問投稿日時:07/01/23 17:25 質問番号:2689895 |
||
回答良回答20pt |
|
| 回答者:chukenkenkou | 実機確認してみましたが、表示結果の違いは、クライアントソフト(コマンドプロンプトやアナライザ)の仕様差ですね。 数値表現の限界に関しては、#1さんの回答の通りで、浮動小数点では小数以下何桁まで精度を維持して欲しい場合には使用すべきではなく、decimal型などを使用すべきです。 今回の表示結果の差は、クライアントソフト自身あるいは、その開発言語の仕様差で、丸め等が行われた結果です。 decimal型などを使用し、小数点以下の精度も保証する定義(ただし、トータル桁数が15桁などの制限あり)にすれば、今回のような問題は発生しません。 |
|---|---|
| 種類:アドバイス どんな人:専門家 自信:参考意見 |
|
| |
回答日時:07/01/23 21:56 回答番号:No.2 |
|
| この回答へのお礼 | お礼が遅くなり大変申し訳ございません。 OacleでもSQLServerでも実際にデータベースに持っている数値とSPL*PLUSやsqlcmdで画面表示(ファイル出力)される値は必ずしも一致しない事が分かりました。 貴重なご回答を賜り誠にありがとうございました。 |
回答良回答10pt |
|
| 回答者:shogo0809 | float型は「浮動小数点数型」と呼ばれる型で、小数を表現する場合に使用されるのですが コンピューターの性質上、すべての小数を正確に表現できるわけではありません。 詳しく検証はしていませんが、おそらく今回の「-3.34」が浮動小数点型として格納された際に誤差が発生した物と思われます。 参考URLはC言語の解説ですが「浮動小数点数型」とはどういう物かを説明しているので 何かの参考になるかもしれません。 この誤差を解決するには、 1. 文字列として格納しておき、演算時に数値に変換する 2. 小数点以下の桁数を決め、例えば2桁ならば100倍して格納しておく 3. 小数を正確に格納できるデータ型を選択する といった選択肢が考えられますが、3.のデータ型についてはSQLServerを使用した経験がないため、存在するかどうかもわかりません。 # MySQLならばDECIMAL型というのがあるのですが。 以上、参考になれば幸いです。 |
|---|---|
| 種類:回答 どんな人:専門家 自信:自信あり |
|
| |
回答日時:07/01/23 17:44 回答番号:No.1 |
|
| 参考URL: | http://www.kyoto-su.ac.jp/~yamada/programming/float.html |
| この回答へのお礼 | お礼の回答が遅くなり、大変申し訳ございません。 SQLServerではデータ型でDECIMAL型を使用する事で、整数部、小数部の桁数を固定できるようです。(例 DECIMAL(m,n)) 貴重なご回答を賜り誠にありがとうございました。 |