为什么 TimeSpan.TotalHours 计算不正确?

Joe*_*tty 2 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());
Run Code Online (Sandbox Code Playgroud)

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

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

截图1

但更令人困惑的是,MessageBox 将计算值显示为 0.4

截图2

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

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

Jak*_*rtz 5

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

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

您有 2 个选项可以在代码中获得 0.4:

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

workedTime = Math.Round(timeSpan.TotalHours, 3)
Run Code Online (Sandbox Code Playgroud)

或者您可以自己使用decimal并除以TotalMinutes60:

decimal workedTime = (decimal)timeSpan.TotalMinutes / 60;
Run Code Online (Sandbox Code Playgroud)

ToString()没有参数或“G”格式说明符将自动将double值四舍五入到 15 位数字。

0.3999999999999997.ToString() // "0.4"
0.399999999999997.ToString()  // "0.399999999999997"
Run Code Online (Sandbox Code Playgroud)