我有以下代码:
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 ...
但为了使其更加混乱,MessageBox将计算值显示为0.4
任何人都可以帮助解释这种看似奇怪的行为吗?
编辑:如果这是一个“浮点不准确”,那么我的代码是什么可以得到0.4的答案?
答案 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"