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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.3985 の関連記事表示

<< 0 >>
■3985  AgentObjectsについて
□投稿者/ まじん -(2006/05/26(Fri) 23:03:26)

    分類:[VB.NET] 


    分類:[VB.NET] 

     いつもお世話になります

     今回 AgentControlを使いたいのですが 動きのパターンとか音とかのリストなど
    分かるところないですか?

     MSDNのサンプルにあったのを見たのですが あまり詳しくないのと 検索をかけてもほんの少ししか出てこないので 何か情報があればよろしくお願い致します。

     みなさんのお陰で 今回のアプリケーションも仕上げの段階に入ってきました もう少し 面白味を付けたいので宜しくお願いします。
親記事 /0過去ログ4より / 関連記事表示
削除チェック/

■3985  SQLServerでのfloat→moneyへのUPDATE
□投稿者/ 片桐 -(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ずつほど増加していくのも気になります。

    確実に同じ数値にする方法はあるでしょうか?
    それとも、何か設定がおかしい?
親記事 /過去ログ13より / 関連記事表示
削除チェック/

■3986  Re[1]: SQLServerでのfloat→moneyへのUPDATE
□投稿者/ 片桐 -(2007/05/30(Wed) 21:57:30)
    一件補足します

    データが異なるのは上1桁、下4桁の範囲です。合計値が上9〜10桁くらいになるので本当に微妙といえば微妙な差異です。
記事No.3985 のレス /過去ログ13より / 関連記事表示
削除チェック/

■3991  Re[1]: SQLServerでのfloat→moneyへのUPDATE
□投稿者/ はつね -(2007/05/31(Thu) 06:37:25)
>
    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したあとに考慮するのか、はたまたどのように考慮(切捨て、切り上げ、四捨五入)などを業務仕様や関連法令(金利などのような場合)と照らし合わせて、自動型変換ではなく明示的に意図的な変換を行う必要があると思います。
記事No.3985 のレス /過去ログ13より / 関連記事表示
削除チェック/

■3999  Re[2]: SQLServerでのfloat→moneyへのUPDATE
□投稿者/ 片桐 -(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

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

    この検証結果をもってユーザーにも要件を確認、この方式で進められる事になりました。
記事No.3985 のレス / END /過去ログ13より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -