如果我有以下代码:
long lSecondsSum = 8039;
double dNumDays = lSecondsSum / (24 * 3600);
我希望获得0.093044
,但由于某种原因,我得到dNumDays = 0.0000000000
。
但是,如果我按如下方式编写代码:
long lSecondsSum = 8039;
double dNumDays = lSecondsSum/24;
dNumDays = dNumDays/3600;
然后我得到了正确的dNumDays = 0.092777777777777778
。
如何避免所有这些浮点错误?
答案 0 :(得分:3)
lSecondsSum为long
,8039/86400
为0
如果您将24 and 3600
转换为双倍,您将获得正确的结果:
double dNumDays = lSecondsSum / (24 * 3600.0);
或者只是:
double dNumDays = lSecondsSum / 24.0 / 3600.0;
答案 1 :(得分:0)
在您的第一个代码段中,您将获得零,因为所有数学都是以整数形式完成,然后通过赋值转换为double。您希望以双精度进行所有数学运算,例如
long lSecondsSum = 8039;
double dNumDays = lSecondsSum / (24.0 * 3600.0);
你的第二个代码片段是有效的,因为第三行是以双精度完成的,但是第二行不是,你可能期望它,所以要小心。
这样做的原因是,如果您执行long * long
或long / long
,则结果将是long
,而不是double
,即使您将结果long
分配给double
,因此数学结果为0.然后将此零分配给double
。但是,long / double
将以双精度完成并为您提供double
,这就是您想要的。基本上,要注意你的计算是以整数数学还是以双精度计算,否则你会被抓住。