Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换双精度-->;不完全是十进制的_C# - Fatal编程技术网

C# 转换双精度-->;不完全是十进制的

C# 转换双精度-->;不完全是十进制的,c#,C#,可能重复: 帮帮我 我正在用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); 何时使用以下输出执行此操作:

可能重复:

帮帮我

我正在用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
当使用双it作为输出时,不完全是:

 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 但算赢7就不准确了


请解释一下为什么会出现这个问题,并用这种方法解决这个问题。

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


小数的位数比双精度的位数多,所以在转换值时,您会看到双精度比十进制精度低的副作用。

我不确定您的问题是什么。但是,如果您对十进制和双精度中的不同值有问题,这是出于设计。默认情况下,带浮点数的数字不精确

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

因此,您在回答问题时,第一个和第二个陈述不同:

原因

5M * Convert.ToDecimal(timespan3.TotalHours)/ 2M
计算单位为十进制, 但在第二种情况下:

5 * timespan3.TotalHours / 2
计算是双倍的(因为timespan3.TotalHours是双倍的)。这意味着结果可能与第一条语句不同。但在计算和时,您将其转换为十进制,它隐式地将值转换为十进制,这可以更改值

在第三条语句中,也有整数值计算,但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;
当执行此操作时,以下输出不相同。
您可以通过指南来解决此问题。否?

首先,您究竟想实现什么目标?根据我对日期和时间的经验,如果您使用的是
double
decimal
,那么您可能做得不对。谢谢Zach Johnson。但windowxp恰恰相反,赢7也不例外。在我的示例中,当使用Round时,它给出了两个不同的结果,分别为0.238和0。237@user1903252只是在黑暗中尝试一下,但你可能看到硬件和软件中实现的浮点算法之间的区别。控制你说这是sao?你解决问题的方式和我说的一样吗?@user1903252对不起,我不太明白你的意思?一点调查告诉我你可能在翻译越南语?(这里的非英语单词“sao”和问题中的“cho”)不幸的是,在翻译过程中有些东西丢失了。双精度是53位,而不是64位。小数是以十进制为基数的,而不是二进制,因此它们在小数位数上“更精确”,而不仅仅是因为有额外的位。你关于硬件和软件的说法只是猜测-1但Windows XP准确无误地赢了7。在我的示例中,当使用Round时,它给出了两个不同的结果,分别为0.238和0.237