3

C#で

double tmp = 3.0 * 0.05;

tmp = 0.1500000000000002

これにはお金が関係しています。値は実際には $0.15 ですが、システムは $0.16 に切り上げる必要があります。0.151 はおそらく 0.16 に切り上げられるべきですが、0.15000000000000002 ではありません。

正しい数値を取得する方法を教えてください (つまり、0.15、または小数が十分に大きい場合は 0.16)。

4

6 に答える 6

14

固定小数点変数タイプ、または Decimal のような 10 進浮動小数点タイプを使用します。浮動小数点数は常にいくらか不正確であり、2 進数の浮動小数点表現は、基数 2 との間で変換するときに別の不正確さのレイヤーを追加します。

于 2008-10-07T16:39:40.943 に答える
5

decimalMoneyは、浮動小数点型であるとして格納する必要があります。同じことは、実際には連続的ではなく離散的であり、論理的に 10 進数である他のデータにも当てはまります。

人間は明らかな理由で小数に対する偏見を持っているため、お金などの「人工的な」量は小数形式の方が適切な傾向があります。「自然な」量 (質量、高さ) は、より連続的なスケールにあります。つまり、float/ double(浮動小数点型) は、多くの場合 (常にではありません) より適切です。

于 2008-10-07T16:49:53.200 に答える
2

エンタープライズ アプリケーション アーキテクチャのパターンで、Martin Fowler は Money 抽象化の使用を推奨しています。

http://martinfowler.com/eaaCatalog/money.html

ほとんどの場合、彼は通貨を扱うためにそれを行いますが、精度も扱います。

この Google ブックの検索結果でその一部を見ることができます。

http://books.google.com/books?id=FyWZt5DdvFkC&pg=PT520&lpg=PT520&dq=money+martin+fowler&source=web&ots=eEys-C_vdA&sig=jckdxgMLSRJtGDYZtcbYST1ak8M&hl=en&sa=X&oi=book_result&resnum=6&ct=結果

于 2008-10-07T16:44:25.427 に答える
0

データ型decimalはうまく機能し、おそらくあなたの選択です。

ただし、過去に、固定小数点整数を使用して最適化された方法でこれを行うことができました。decimalこれは、パフォーマンスが低下し、 の小さな精度誤差を許容できない高性能計算に最適ですfloat

から始めて、 と言ってInt32、半分に分割します。前半は整数部分、後半は小数部分です。16 ビットの符号付き整数と 16 ビットの小数精度が得られます。たとえば、16:16 固定小数点としての 1.5 は として表され0x00018000ます。または、必要に応じてビットの配分を変更します。

固定小数点数は通常、他の整数と同様に追加/サブ/マルチ/ディビジョンできますが、オーバーフローを避けるためにマルチ/ディビジョンを少し回避する必要があります。

于 2008-10-07T17:01:25.410 に答える
0

あなたが直面したのは丸めの問題です。これについては、別の投稿で以前に言及しました

.NET で「System.Currency」を使用できますか?

これも参考

于 2008-10-08T03:38:42.143 に答える
0

'decimal' タイプは、このために特別に設計されました

于 2008-10-07T16:41:08.383 に答える