
No.2ベストアンサー
- 回答日時:
floatもrealもいわゆる概数といわれるデータ型で、小数の保持には必ず誤差が生じます。
一方、SQL Serverにはデータ型の優先順位というものがあります。
http://msdn.microsoft.com/ja-jp/library/ms190309 …
floatもrealもmoneyより上です。
したがって、float * money, real * moneyの演算を行うと、moneyはそれぞれfloat, realに変換されてから演算に使われます。
moneyで9.4と持っていたものがreal型に変換されると、結局9,4にはなりません。
おそらく9.399999389...あたりになってしまいます。realの有効桁数は7桁しかありませんから、小数点以下7桁目以降はアテにならない数字になります。
これに200を掛けても1879.999877..などとなるため、floorを掛けても1879になってしまいます。
floatも基本は同じですが、有効桁数が15桁あります。
moneyの9.4はおそらく9.40000000000004くらいの精度で変換されます。したがってfloorを掛けても1880と出ます。
しかし、誤差が上に出るか、下に出るかは扱う数字により保証の限りではありません。
したがって、real型やfloat型を金額計算に用いるべきではありません。
numeric(decimal)で計算すべきでしょう。
#質問者さんは結果をmoney型で受け取ろうとされているようです。
jamshid6 さん、ありがとうございます。
<小数の保持には必ず誤差が生じます>これは読んでいたのですが、
小数点第何位かをまとめるのだろうと勝手に解釈していました。
データ型で計算が違ってくるとは思ってもいませんでした。
勉強になりました。
数量を decimal(10,2)に変更します。
ありがとうございました。
No.3
- 回答日時:
結論がでたようですが、こちらも以下で再現しました。
できれば第三者が再現可能なソースを提示していただけると理解が早いです。
-----------
DECLARE @rReat Real
DECLARE @mMoney money
DECLARE @fReat float
set @rReat =200
set @fReat =200
set @mMoney = 9.4
select @rReat * @mMoney
select FLOOR(@rReat * @mMoney)
select @fReat * @mMoney
select FLOOR(@fReat * @mMoney)
-------------
1880
(1 行処理されました)
----------------------
1879
(1 行処理されました)
----------------------
1880
(1 行処理されました)
----------------------
1880
(1 行処理されました)
3rd_001 さん、ありがとうございます。
Floorで切り捨てているから、中途半端な数字になるのですよね。
でも通常は1円以下の数字は切り捨てるので、Floorが便利だったのです。
また次回からはソースも提示するようにします。
本当にありがとうございました。
No.1
- 回答日時:
DECLARE @rReat Real
DECLARE @rMoney Real
DECLARE @fReat float
DECLARE @fMoney float
set @rReat =200
set @rMoney =9.4
set @fReat =200
set @fMoney = 9.4
select @rReat * @rMoney
select @fReat * @fMoney
select 200*9.4
試しに上記で計算してみましたが、すべて「1880」になりました。
再現ケースを示してください。
参考:float 型と real 型 (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms173773 …
この回答への補足
3rd_001 さん、ありがとうございます。
実際に使用しているのは、下記SQLですが、テストで新しいテーブルを作成し、数量をreal型にすると、同じ結果(1879.99988)が出ます。
単価をreat型にしても同じです。
SQLがExpressのせいでしょうか(まさか??)
私のPC,もしくはSQL固有の問題なのでしょうか?
参考リンクも読みましたが、real型で問題あるとは思えません。
begin
SELECT TOP (100) PERCENT 発注明細ID, 発注管理ID, 部品ID, 内訳, 数量, 単位, 単価, FLOOR(数量 * 単価) AS 金額, 納品, 摘要, 員数,
員数単位
FROM dbo.T_発注明細
where発注管理ID=@myid
ORDER BY 発注明細ID
end
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(お金・保険・資産運用) 至急!【Wolt】各メニューの価格設定の簡単な計算方法 3 2023/03/05 11:58
- 投資・株式の税金 一般口座で同一銘柄の総平均法のことで 1 2023/02/27 22:08
- 会計ソフト・業務用ソフト エクセル 計算 2 2022/04/19 17:56
- Excel(エクセル) エクセルで時間の合計 5 2022/06/04 10:54
- 格安スマホ・SIMフリースマホ 今 ahamoを使っていて 4898円以下になる携帯会社があれば乗り換えたいです 20GBと24時間 9 2022/09/27 07:43
- Excel(エクセル) 10円の誤差が分からない 11 2022/11/13 07:25
- 会社・職場 レジの打ち間違いについて お弁当屋でレジの仕事してるんですが… 1つの商品を打ち間違いして レジ締め 2 2023/07/14 14:57
- 大学・短大 いくら考えても以下の問題の解き方が分かりません。 どなたか、解説していただけると嬉しいです。 日本の 1 2022/07/06 02:52
- C言語・C++・C# キャスト演算について。 1 2023/07/15 15:28
- 自動車ローン・自動車保険・車両保険 車の残価設定ローンの金利手数料について教えてください 5 2023/03/15 22:36
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カーソル0件の時にエラーを発生...
-
カーソル宣言をIFで分けられま...
-
テーブルの項目が異なるテーブ...
-
処理件数を非表示にしたい
-
データ型でFloatとreal の計算...
-
カーソルオープンの処理について
-
カーソルを使って、最終行レコ...
-
ACCESSで一括処理する方法
-
300万件のデータの処理について
-
Accessで処理経過を表示したい...
-
カーソルがコミットするとクロ...
-
(x 行処理されました)を表示さ...
-
複数レコードを1変数にセット...
-
SQLで特定の項目の重複のみを排...
-
フィルターかけた後、重複を除...
-
差し込み後、元データを変更し...
-
エクセルで最後の文字だけ置き...
-
外部参照してるキーを主キーに...
-
INSERT文でフィールドの1つだ...
-
SELECT 文 GROUP での1件目を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カーソル0件の時にエラーを発生...
-
処理件数を非表示にしたい
-
カーソルを使って、最終行レコ...
-
データ型でFloatとreal の計算...
-
ストアドプロシージャ_カーソル...
-
クエリの実行時間の目安
-
カーソル宣言をIFで分けられま...
-
NVLとDECODEのスピード差
-
カーソルがコミットするとクロ...
-
テーブルの項目が異なるテーブ...
-
SQL-LOADERの逆のもの
-
(x 行処理されました)を表示さ...
-
Accessで処理経過を表示したい...
-
ACCESSで一括処理する方法
-
PL/SQL で continue ?
-
カーソルオープンの処理について
-
動的SQLの処理件数
-
わり算の結果が整数でも小数点...
-
SQL plus で改行
-
RDBとVSAMの比較
おすすめ情報