【发布时间】:2016-12-30 10:41:48
【问题描述】:
在这个例子中,floor 的行为不同,我不明白为什么:
printf("floor(34000000.535 * 100 + 0.5) : %lf \n", floor(34000000.535 * 100 + 0.5));
printf("floor(33000000.535 * 100 + 0.5) : %lf \n", floor(33000000.535 * 100 + 0.5));
这段代码的输出是:
floor(34000000.535 * 100 + 0.5) : 3400000053.000000
floor(33000000.535 * 100 + 0.5) : 3300000054.000000
为什么第一个结果不等于我们预期的 3400000054.0?
【问题讨论】:
-
当然是舍入问题,如果您需要精确计算,请使用任意精度数学库(例如 gmp)。
-
因为你正在处理二进制浮点数。
-
@cHao 请注意,即使使用 decimal floating point,当值接近格式的精度限制时,也会出现此类问题。这就是浮点算术的特性,在任何基础上。十进制文本和二进制
double肯定更常见。
标签: c floating-point rounding