可能重复:
What is the difference between Decimal, Float and Double in 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);
什么时候输出如下:
_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)
注意:然后计算win XP:0.2375 但计算胜利7然后不完全。
请解释为什么要解决这个问题并解决这个问题?
答案 0 :(得分:1)
双打是浮点值。它们仍然限制在64位精度,但它们有一个值和一个指数,该值被提升到(基本上是科学记数法)。这就是为什么它们的范围超过整数或长数,但由于这个扩展范围,它们无法表示该范围内的每个可能值。
小数位数比双数位多,所以在转换数值时,你只会看到与小数相比精度加倍的副作用。
答案 1 :(得分:0)
我不确定你的问题是什么。但是如果你有十进制和双倍的不同值的问题,那就是设计。默认情况下,具有浮点数的数字不会被预先填充。
更新:(在答案中回答您的问题)
由于这是你在答案中的问题,第一和第二个陈述不同:
原因
5M * Convert.ToDecimal(timespan3.TotalHours)/ 2M
计算是十进制的, 但在第二个:
5 * timespan3.TotalHours / 2
计算是双倍的(导致timespan3.TotalHours是double)。这意味着结果可能与第一个语句不同。但是在计算和计算时,你将它转换为十进制,它隐式地将值转换为十进制,这可以改变值。
在第三个语句中,您也有整数值计算,但double是浮点类型,因此它的值可能与第二个语句不同,其中定点类型为十进制。
答案 2 :(得分: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;
何时执行此操作他们ra以下输出不一样。 你可以指导解决这个问题吗?