>小数不完全

可能重复:
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 _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)

注意:计算赢得XP然后确切:0.2375但计算胜利7然后不完全。

请解释我为什么解决这个问题的方法?


双打是浮点值。 它们仍然被限制在64位的精度,但是它们有一个值和一个指数值被提高到(基本上是科学记数法)。这就是为什么它们的范围比整数或长整数多,但是由于这个扩展的范围,它们无法代表该范围内的每个可能的值。

小数的位数多于double,所以当你转换数值时,你会发现double的精度低于decimal的副作用。


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;

何时执行这样的操作,它们会产生不同的以下输出。 你可以指导解决这个问题没有?


我不确定你的问题是什么。 但是如果你在小数和双数的不同值有问题,这是设计。 默认情况下浮点数不会缩小。

更新:(在答案中回答你的问题)

由于这个问题的答案,第一和第二个陈述不同:

原因

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

计算以十进制表示,但以秒为单位:

5 * timespan3.TotalHours / 2

计算结果是双倍(原因时间跨度3.TotalHours是双倍)。 这意味着结果可能与第一条语句不同。 但在计算时,您将其转换为十进制数,并将其隐式转换为十进制数,这可以更改数值。

在第三条语句中,你也有整数值计算,但double是浮点类型,所以它的值可以不同于第二条语句,其中定点类型为十进制。

链接地址: http://www.djcxy.com/p/21345.html

上一篇: > Decimal not exactly

下一篇: C# issue with double number