为什么TimeSpan.TotalHours无法正确计算?

时间:2015-12-03 18:26:39

标签: c# winforms

我有以下代码:

DateTime PunchIn = DateTime.Parse("12/10/2015 5:06:00 PM");
DateTime PunchOut = DateTime.Parse("12/10/2015 5:30:00 PM");
double WorkedTime;
WorkedTime = (PunchOut - PunchIn).TotalHours;

MessageBox.Show(WorkedTime.ToString());

WorkedTime的值应为0.4(24/60)。

但是从下面的屏幕截图中可以看出,计算出的值是0.39999999 ...

screenshot1

但为了使其更加混乱,MessageBox将计算值显示为0.4

screenshot2

任何人都可以帮助解释这种看似奇怪的行为吗?

编辑:如果这是一个“浮点不准确”,那么我的代码是什么可以得到0.4的答案?

1 个答案:

答案 0 :(得分:3)

许多十进制数不能表示为没有精度损失的二进制浮点数。就像1/3不能表示为有限的十进制数。

您得到的是能够以所选格式表示的最接近的数字。

您的代码中有两个选项可以获得0.4:

您可以使用Math.Round来删除无关紧要的数字:

workedTime = Math.Round(timeSpan.TotalHours, 3)

或者您可以使用decimal并将TotalMinutes除以60:

decimal workedTime = (decimal)timeSpan.TotalMinutes / 60;
没有参数的

ToString()"G" format specifier会自动将double值舍入为15位数。

0.3999999999999997.ToString() // "0.4"
0.399999999999997.ToString()  // "0.399999999999997"