0

私は、floatデータ型を使用して、小数点以下2桁(ドルとセント)のみである必要がある値を格納するデータベースに取り組んでいます。

float列を更新する人がROUNDを実行する限り、floatの使用は問題なく機能しているように見えます。もちろん、これは常に発生するとは限りません。SUMが実行されると、表示は小数点以下2桁のみを表示するようにフォーマットされているため、表示されているものから常に数ペニーずれています。このデータベースには、floatを使用する数百のテーブルがあり、float列を自動的に丸めることができると便利です。

これはできますか?

INSERTおよびUPDATEでTRIGGERを使用して、列でROUNDを実行できますか?

可能であれば、TRIGGERをどのようにコーディングするかを示し、それをお勧めしますか?

他のアイデアはありますか?

SQLServer2005を使用しています

これは、 「フロートまたはデシマルを会計アプリケーションのドル額に使用しますか?」という質問をする投稿です。、そして私は言った1つの応答が好きです

「ある種の固定小数点/任意精度の数値パッケージ(Java BigNum、Python 10進モジュールなど)の使用を実際に検討する必要があります。そうしないと、傷ついた世界に陥ることになります。」

4

3 に答える 3

3

トリガーを実行できますが、これはそれらの不合理な使用ではありません。挿入前および更新前のトリガーは正常に機能するはずです。

さらに、次のようなワンショット修正を行うことができます。

update tbl set column = round(column * 100) / 100

構文は完璧ではないかもしれませんが、アイデアは得られるはずです。

しかし、あなたの「数ペニーのオフ」の発言を理解しているかどうかはわかりません. エラーが 0.01 に累積するには、かなり多くの浮動小数点数を合計する必要があります。使用している列定義は何ですか?

もちろん、money 型の 10 進列定義の 1 つの方が完全に正確ですが、DBMS 間の移植性が失われる可能性があります。

于 2009-02-05T11:05:12.917 に答える
3

システムを制御できる場合、FLOAT の代わりに DECIMAL /MONEY/NUMERIC データ型を使用できますか?

結局のところ、それはあなたが参照した質問のポイントです。

そうでない場合、そして私たちの多くと同じように、あなたがその痛みの世界に住むことを余儀なくされている場合、あなたのトリガーの提案はうまくいくでしょう. ただし、別の方法で制御することを
お勧めします...-アプリまたはユーザーにテーブルへの直接書き込みアクセスを許可しないでください
-SPを介したアクセスを強制します

また、書き込みアクセスが 1 つの (入力/保持) テーブルに与えられるシステムも見てきました。このテーブルには、データを実際のテーブルにコピー (およびフォーマット/検証) するためのトリガーがあります。

于 2009-02-05T11:15:45.500 に答える
1

丸めることで、あなたが望むものを正確に得ることができるとは思いません。浮動小数点数の丸めは、正確かつ確実に機能しません。何をするにせよ、2 進数に 10 進数の丸めを適用しようとすることになり、2 のべき乗以外は正確になりません。

目的のために明示的に設計された 10 進データ型を使用することによってのみ、任意のサブ整数量のデータベースに格納された正確な 10 進表現を取得できます。これらのデータ型は通常、何らかの形式のパック 10 進数ストレージを使用します (バイナリよりも効率が悪いため)。たとえば、2009 は として格納され0x2009ます。

CONVERT関数を使用するとどうなりますか? このようなものを使用してクエリを試みましたか?

CONVERT(money, your_float_column)

長期的には、目的の型を持つテーブルに列を追加し、挿入後/更新トリガーを通じてその値を維持することを検討し、時間の経過とともにすべてのコードを切り替えてその列を使用することを検討すると思います。

それから、フロートに金額を保管するのが良い考えだと思った個人を探し出して罰します...

于 2009-02-05T13:16:16.257 に答える