SQLServer2005でfloat型の項目に-3.34 を手入力(クエリアナライザでinsert文で入力した時も同様)して、コマンドプロンプトから以下のselect文を実行した所、-3.3399999999999999 で表示されました。
sqlcmd -U ユーザ名 -P パスワード -d データベース名
1> select * from テーブル名
クエリアナライザで同様に select * from テーブル名
した場合は、-3.34 のまま正しく表示されます。
-12.34、-22.34などの数値ではこの事象は発生せず、何か条件があるようです。お分かりになる方がいらっしゃいましたら、ご教示いただけないでしょうか?
No.2ベストアンサー
- 回答日時:
実機確認してみましたが、表示結果の違いは、クライアントソフト(コマンドプロンプトやアナライザ)の仕様差ですね。
数値表現の限界に関しては、#1さんの回答の通りで、浮動小数点では小数以下何桁まで精度を維持して欲しい場合には使用すべきではなく、decimal型などを使用すべきです。
今回の表示結果の差は、クライアントソフト自身あるいは、その開発言語の仕様差で、丸め等が行われた結果です。
decimal型などを使用し、小数点以下の精度も保証する定義(ただし、トータル桁数が15桁などの制限あり)にすれば、今回のような問題は発生しません。
お礼が遅くなり大変申し訳ございません。
OacleでもSQLServerでも実際にデータベースに持っている数値とSPL*PLUSやsqlcmdで画面表示(ファイル出力)される値は必ずしも一致しない事が分かりました。
貴重なご回答を賜り誠にありがとうございました。
No.1
- 回答日時:
float型は「浮動小数点数型」と呼ばれる型で、小数を表現する場合に使用されるのですが
コンピューターの性質上、すべての小数を正確に表現できるわけではありません。
詳しく検証はしていませんが、おそらく今回の「-3.34」が浮動小数点型として格納された際に誤差が発生した物と思われます。
参考URLはC言語の解説ですが「浮動小数点数型」とはどういう物かを説明しているので
何かの参考になるかもしれません。
この誤差を解決するには、
1. 文字列として格納しておき、演算時に数値に変換する
2. 小数点以下の桁数を決め、例えば2桁ならば100倍して格納しておく
3. 小数を正確に格納できるデータ型を選択する
といった選択肢が考えられますが、3.のデータ型についてはSQLServerを使用した経験がないため、存在するかどうかもわかりません。
# MySQLならばDECIMAL型というのがあるのですが。
以上、参考になれば幸いです。
参考URL:http://www.kyoto-su.ac.jp/~yamada/programming/fl …
お礼の回答が遅くなり、大変申し訳ございません。
SQLServerではデータ型でDECIMAL型を使用する事で、整数部、小数部の桁数を固定できるようです。(例 DECIMAL(m,n))
貴重なご回答を賜り誠にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- Oracle SQL update方法 2 2022/06/22 14:07
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLのVARCHARとVARCHAR2の違い
-
プライマリーキーの昇順でソー...
-
Float型の時の計算結果がおかしい
-
AccessからOrcleのODBCリンクテ...
-
ヌル値は記憶容量を必要としな...
-
INT型は金額の型に使用するべき...
-
postgresQL に格納した画像ファ...
-
VBAで変数内に保持された二次配...
-
TRUE/FALSEのデータ型
-
ハングル文字が入らない。
-
postgreSQLのデータ型
-
MySQLで先頭の0が省略されてし...
-
接続ができません
-
副問合せにLIKE文を使う方法は...
-
like句を使って日本語を検索す...
-
RPMのmysqlとmysql-serverの違い
-
DB内の日本語データがPHPで取得...
-
ERROR 1045 (28000) (using pas...
-
mysqlのsecure-file-privオプシ...
-
ODP.NETのバージョン確認
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLのVARCHARとVARCHAR2の違い
-
INT型は金額の型に使用するべき...
-
postgreSQLのデータ型
-
プライマリーキーの昇順でソー...
-
VBAで変数内に保持された二次配...
-
Float型の時の計算結果がおかしい
-
ヌル値は記憶容量を必要としな...
-
MySQLの型のサイズ指定で速度は...
-
経過時間(hhmmdd)をDATE型には...
-
データベースのフィールドのデ...
-
ブログサイトを作る時、mysqlは...
-
オラクルのデータ型・通貨について
-
AccessからOrcleのODBCリンクテ...
-
MysqlにURLを登録する方法
-
PDFをDBに格納する/取り出すには?
-
ハングル文字が入らない。
-
Excel VBA SelectedItems
-
insertでのエラーについて
-
DB2 INSERT時の格納順序
-
-3.34 が -3.3399999999999999 ...
おすすめ情報