![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
ユーザー側で、Microsoft SQL Server2000を使用しています。
計算結果がおかしいので、仕事場で、SQL2008環境で互換モードでも、以下の現象が出てこまって
おります。テストで、確認しました。
23.0 - 22.1
の計算結果を0.9と出したいのですが、
0.899999999999999
と結果が返ってきます。
どこが間違っているのでしょうか?
SELECT
[Field01] AS 'Field01'
,[Field02] AS 'Field02'
,[Field01]-[Field02] AS 'Field01-02'
,(CAST(23 AS FLOAT) - cast(22.1 AS FLOAT) ) AS 'test1'
,(CAST(23 AS REAL ) - cast(22.1 AS REAL ) ) AS 'test2'
FROM
[dbo].[Table01]
![「Float型の時の計算結果がおかしい」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/6/854039_5497da816cae6/M.jpg)
No.2ベストアンサー
- 回答日時:
間違ってはいません。
しかし浮動小数点データは概数であるため、データ型の範囲に含まれるすべての値を正確に表せるわけではありません。
SQLServer 2008 などの概数型は IEEE754 仕様に従っています。
概数型では、多くの場合、指定されたとおり正確な値が格納されません。正確な値にきわめて近い概数が格納されます。多くのアプリケーションでは指定した値と格納される概数のわずかな差は問題にはなりません。ただし、その差が問題になる場合もあります。float 型と real 型にはこのような概数の性質があるので、財務アプリケーション、丸めが行われる演算、等価性のチェックなど、正確な数値動作が必要な場合には、これらのデータ型を使用しないでください。
代わりに、int 型、decimal 型、money 型、smallmoney 型を使用することをお勧めします。
実際にはどういうことなのか、多少極端ですが、例を上げてみましょう。
いま、ここで新しいCPUを構想していて、4ビットで 0.00~4.00 までの実数を表現するものを考えているとします。
この例題で、4 ビットのうちの上位2ビットを 1の位、下位2ビットを小数点以下の位にすると仮定した場合、小数点以下は2ビットしかありませんから、2進数の 00 を 0.00、2進数の 01 を 0.025、2進数の 10 を 0.05、2進数の 11 を 0.075 と表現する合計4つのみとなります。そして、1の位は 0、1、2、3 です。
この範囲で表現できる数値では正確な4は表現できませんが、概数として表せば、3.75 が一番4に近い数値となるわけです。
実際にはもう少しビット数が多いわけですが、おおむねこのような仕組みで実数が表現されています。
詳しいご回答ありがとうございました。
以下の様なやり方で、正しく出来そうです。
少数桁は、4桁までなのでMONEY型処理で大丈夫そうです。
SELECT
[Field01] AS 'Field01'
,[Field02] AS 'Field02'
,(CAST([Field01] AS MONEY) - cast([Field02] AS MONEY) ) AS '正01'
,(CAST(([Field01]-[Field02]) AS MONEY) ) AS '正02'
FROM
[dbo].[Table01]
しかし、浮動小数点ってやっかいな型なのですね。
勉強になりました。
No.3
- 回答日時:
おかしくなって当然です。
回避策は、#2 さんがしめされているので
なぜか?
の部分をExcelの場合で説明されています。
SQLServer でも考え方は一緒です。
※ #2 さんの詳しい解説ですね。
日経PC21 / エクセル(Excel)「演算誤差」対策講座
http://pc.nikkeibp.co.jp/pc21/special/gosa/
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- Visual Basic(VBA) Dateserialで データ抽出 2 2022/06/26 21:07
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) Sheet2の日付をキーにオートフィルターで2023年1月のデータを抽出し、Sheet3へ書き出すた 2 2023/03/06 23:57
- Visual Basic(VBA) VBAのフィルター操作 5 2023/08/08 09:48
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
データ型でFloatとreal の計算の違い?
SQL Server
-
【SQLサーバ】float型における小数点以下のデータを抽出する方法について
SQL Server
-
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
-
4
少数部の桁数の求め方
SQL Server
-
5
DataTableに入っているデータを全てinsertしたい!(C#)
Microsoft ASP
-
6
-3.34 が -3.3399999999999999 で表示される
SQL Server
-
7
BCPユーティリティの使用法_ヘッダー情報の取得_
その他(プログラミング・Web制作)
-
8
SQLSever 一括インポートについて
その他(パソコン・スマホ・電化製品)
-
9
オラクルではできるのにSQLSERVERではサブクエリーで複数キーを指定できない?
SQL Server
-
10
VBAで「致命的なエラー」が出ました。どのくらい致命的なんでしょうか?
Access(アクセス)
-
11
.NETアプリを作ったときの .manifest ファイルって必要なの
C言語・C++・C#
-
12
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
13
YES/NO型の値
Excel(エクセル)
-
14
DBの定義のサイズを大きくし過ぎると問題ある?
その他(データベース)
-
15
Winmerge ファイルの中身は同じなのに黄色くなる
その他(OS)
-
16
Javascript_submit()完了後に処理したい
JavaScript
-
17
Access レポート印刷するときに1ページに収める方法
Access(アクセス)
-
18
excelの列幅高さが勝手に変わる(特定のPCだけ)
Excel(エクセル)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLのVARCHARとVARCHAR2の違い
-
postgreSQLのデータ型
-
Float型の時の計算結果がおかしい
-
INT型は金額の型に使用するべき...
-
Excel VBA SelectedItems
-
オラクルのデータ型・通貨について
-
MySQLの型のサイズ指定で速度は...
-
フォームから入力されたデータ...
-
カラムの長さを指定する意味に...
-
VBAで変数内に保持された二次配...
-
SQL文を文字型変数に格納し、EX...
-
オブジェクト変数にブックを格...
-
【MySQL】時間を格納したり計算...
-
TRUE/FALSEのデータ型
-
接続ができません
-
MySQLのテーブル作成でハイフン...
-
副問合せにLIKE文を使う方法は...
-
like句を使って日本語を検索す...
-
ODP.NETのバージョン確認
-
mysqlへのインポート処理がうま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLのVARCHARとVARCHAR2の違い
-
VBAで変数内に保持された二次配...
-
プライマリーキーの昇順でソー...
-
INT型は金額の型に使用するべき...
-
Float型の時の計算結果がおかしい
-
データベースのフィールドのデ...
-
postgreSQLのデータ型
-
ヌル値は記憶容量を必要としな...
-
-3.34 が -3.3399999999999999 ...
-
insertでのエラーについて
-
オラクルのデータ型・通貨について
-
MySQLの型のサイズ指定で速度は...
-
Excel VBA SelectedItems
-
ハングル文字が入らない。
-
カラムの長さを指定する意味に...
-
経過時間(hhmmdd)をDATE型には...
-
DB2 INSERT時の格納順序
-
mysql(mariaDB)の格納文字数は...
-
[SQLserver]長文に適したデータ...
-
Microsoftストアのソフトは特別...
おすすめ情報