C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: SQLServerでのfloat→moneyへのUPDATE


(過去ログ 13 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■3985 / inTopicNo.1)  SQLServerでのfloat→moneyへのUPDATE
  
□投稿者/ 片桐 (12回)-(2007/05/30(Wed) 21:47:46)

分類:[データベース全般] 

と表題が書ききれませんでした。片桐@悩める子羊です。

要するに、
「SQLServer2005-SP2でfloat型を四則計算、集合関数でSUM後にmoney型フィールドへUPDATEした場合、算出結果が異なる現象の原因と対処方法を知りたい」です。

TABLE A( a float ,ritu float,ID int) ←IDが2000個、1ID当たり200件
TABLE B( b money ,ID int)

でAとBの関係はN:1です。A.aには約上6〜7桁くらいの数値が、rituには上3桁、下5桁くらいの数値が入ってきますが上限は100です。ここで、

UPDATE B.b = A1.a from B,(SELECT ID, sum(a * (ritu /100)) AS a from A group by ID) A1 where B.ID = A1.ID;
SELECT ID , b from B;
go

というSQLをクエリで10回連続で走らせた時、Aテーブルの中身が全く同じものであるにもかかわらず、走らせるたびにB.bの値が異なってしまいます。

sum(a * (ritu /100))  の集計値は10回とも一致していることは確認できたのですが、いざ、money型へUPDATEするとおかしい……
ちなみに、非常に微妙な数値で、1.xxxずつほど増加していくのも気になります。

確実に同じ数値にする方法はあるでしょうか?
それとも、何か設定がおかしい?

引用返信 編集キー/
■3986 / inTopicNo.2)  Re[1]: SQLServerでのfloat→moneyへのUPDATE
□投稿者/ 片桐 (13回)-(2007/05/30(Wed) 21:57:30)
一件補足します

データが異なるのは上1桁、下4桁の範囲です。合計値が上9〜10桁くらいになるので本当に微妙といえば微妙な差異です。
引用返信 編集キー/
■3991 / inTopicNo.3)  Re[1]: SQLServerでのfloat→moneyへのUPDATE
□投稿者/ はつね (170回)-(2007/05/31(Thu) 06:37:25)
はつね さんの Web サイト
No3985 (片桐 さん) に返信
> TABLE A( a float ,ritu float,ID int) ←IDが2000個、1ID当たり200件
> TABLE B( b money ,ID int)

float型の演算結果をmoney型にいれるような場合、つまり浮動小数点数という計算誤差が生じやすい型から厳密な固定小数点の扱いに変える場合、SQL Serverに限らず計算誤差や変換誤差が発生する可能性を常に考慮しなくてはなりません。
それぞれのレコードの a * (ritu / 100)の値は、1/3のように有効桁の固定小数点で正確に表せない値になっていないでしょうか。

正確にあわらせないレコードが1つでもあれば、sumした結果をfloat型からmoney型へ型変換するときに丸め誤差などが生じる可能性があります。sumするまえに考慮するのかsumしたあとに考慮するのか、はたまたどのように考慮(切捨て、切り上げ、四捨五入)などを業務仕様や関連法令(金利などのような場合)と照らし合わせて、自動型変換ではなく明示的に意図的な変換を行う必要があると思います。

引用返信 編集キー/
■3999 / inTopicNo.4)  Re[2]: SQLServerでのfloat→moneyへのUPDATE
□投稿者/ 片桐 (14回)-(2007/05/31(Thu) 11:28:58)
はつねさん、ヒントをありがとうございます

で、ちょい変更。明示的にmoney型で集計しろー、とやってみたところ、

UPDATE B.b = A1.a from B,(SELECT ID, sum(cast((a * (ritu /100)) as money)) AS a from A group by ID) A1 where B.ID = A1.ID;
SELECT ID , b from B;
go

見事、全ての値の一致を確認できました。

この検証結果をもってユーザーにも要件を確認、この方式で進められる事になりました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -