2

重複の可能性:
C# の Decimal、Float、Double の違いは何ですか?

助けて。

C# でアプリケーションを開発しています。やっています:

DateTime dtm1 = new DateTime(2012, 11, 15, 11, 3, 0);
DateTime dtm2 = new DateTime(2012, 11, 15, 11, 3, 20);
TimeSpan timespan3 = dtm2 - dtm1;
decimal _Hour = Convert.ToDecimal(timespan3.TotalHours);

次のような出力でそのようなことを行うと:

 _Hour = 0.00555555555555556M

を使用する場合は正確ではありませんが、出力に double のタイプを使用する場合:

 double _Hour = timespan3.TotalHours;

 output: 0.0055555555555555549

たとえば、次のとおりです。

public decimal tinhDienTichHinhThang(decimal D1, decimal D2, decimal H)
        {
            //tính tổng 2 đáy
            decimal tong2Day = D1 + D2;
            //cộng vào nhân chiều cao :))
            tong2Day = tong2Day * H;

            //return diện tích
            return tong2Day / 2;
        }


DateTime dtm1 = new DateTime(2012, 11, 15, 11, 3, 0);
DateTime dtm2 = new DateTime(2012, 11, 15, 11, 3, 20);
TimeSpan timespan3 = dtm2 - dtm1;

///progress
///cal1: _Hour
///cal2: decimal D1 = 0.25
///cal3: decimal D2 = 5
///cal4: decimal D3 = 0.9

decimal test1 = (decimal test1 = Math.Round((D1 + tinhDienTichHinhThang(D2, 0, Convert.ToDecimal(timespan3.TotalHours))) * D3, 3, MidpointRounding.AwayFromZero);

出力: test1 = 0.237

手動で計算する場合:

test1 =  Math.Round((0.25 + ((5+0)*timespan3.TotalHours/2))*0.9, 3, MidpointRounding.AwayFromZero);

出力:test1 = 0.238 (正確には: 0.2375)

注: win XP を正確に計算する: 0.2375 しかし、win 7 を計算すると正確ではありません。

なぜこの問題をどのように解決するのかという問題を解釈してください。

4

3 に答える 3

1

double は浮動小数点値です。それらは依然として 64 ビットの精度に制限されていますが、値とその値が累乗される指数 (本質的には科学表記法) を持っています。その範囲内のすべての可能な値を表します。

10 進数は double よりも多くのビットを持っているため、値を変換するときに、10 進数と比較して double の精度が低いという副作用が見られます。

于 2012-12-14T07:37:28.983 に答える
0

何が問題なのかわかりません。ただし、10進数と2進数の値が異なる場合は、仕様によるものです。デフォルトで浮動小数点のある数値は正確ではありません。

更新:(回答であなたの質問に答えてください)

このため、回答の質問、最初と2番目のステートメントは異なります。

原因

5M * Convert.ToDecimal(timespan3.TotalHours)/ 2M

計算は10進数ですが、秒単位です。

5 * timespan3.TotalHours / 2

計算は2倍になります(timespan3.TotalHoursが2倍になるため)。これは、結果が最初のステートメントと異なる可能性があることを意味します。ただし、計算の時点で、それを10進数にキャストすると、値が暗黙的に10進数に変換され、値が変更される可能性があります。

3番目のステートメントにも整数値の計算がありますが、doubleは浮動小数点型であるため、その値は、固定小数点型が10進数である2番目のステートメントとは異なる場合があります。

于 2012-12-14T07:39:47.200 に答える
0
decimal test1 = (0.25M + 5M * Convert.ToDecimal(timespan3.TotalHours) / 2M) * 0.9M;

decimal test2 = (decimal)((0.25 + 5 * timespan3.TotalHours / 2) * 0.9);

double test3 = (0.25 + 5 * timespan3.TotalHours / 2) * 0.9;

そのようなことを実行する場合、次の出力は同じではありません。この問題を解決するためにガイドできますか?

于 2012-12-14T08:19:30.440 に答える