C ++:简单的运算符优先级问题还是其他什么?

时间:2013-12-14 00:24:32

标签: c++ visual-c++

如果我有以下代码:

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

如何避免所有这些浮点错误?

2 个答案:

答案 0 :(得分:3)

lSecondsSum为long8039/864000

如果您将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 * longlong / long,则结果将是long,而不是double,即使您将结果long分配给double,因此数学结果为0.然后将此零分配给double。但是,long / double将以双精度完成并为您提供double,这就是您想要的。基本上,要注意你的计算是以整数数学还是以双精度计算,否则你会被抓住。