Possible Duplicate:
Why “for( i = 0.1 ; i != 1.0 ; i += 0.1)” doesn’t break at i = 1.0?
我有一个数字(实数)区间 [x, y]。我必须使用类似的方法遍历它:
nr = 0;
for (i = x; i <= y; i += step) //step is a small double value
nr++;
对于步长为 0.001 的 [-1, 1],很明显 nr 应该是 2001 (-1.000 ... 0.999 1.000),但是它计算出 nr = 2000(我调查过,最后一次比较失败了:0.999 + 0.001 > 1.000)
如何计算准确的 nr 值?
您需要使用整数来执行此操作,或者对不精确感到满意,因为 float 和 double 本质上是不精确的*。您的代码完全按照 C 语言规范工作。在需要精确精度的情况下使用 float 和 double 是不安全的。
除此之外,您还需要在问题中提供有关您的要求的更多信息。如果 nr
是一个温度,那么要计算您需要使用不存在或不存在的物理学的确切值(我不是物理学家,所以我不能告诉你)。如果 step
实际上是一个不合理的值,那么您必须向上或向下舍入 - 您的调用以及哪个是正确的取决于您的业务逻辑要求。如果它是有理数并且不需要四舍五入,那么您需要乘以最小公分母并使用 int
(或 C 等中的分数类)。
*如果您可以强制 step
和 y
符合您的问题,则当分数的分母是 2 的幂时,每个评论 float / double 是精确会有点清楚,但当然,如果 step
没有平均划分为 y
,您将需要执行与上述完全相同的业务逻辑处理。