舍入时[int] = [float] + [int](Obj-C,iOS?)

时间:2013-04-05 11:30:20

标签: ios objective-c rounding floating-point-precision

在这种情况下:

float a = 0.99999f;
int b = 1000;
int c = a + b;

结果c = 1001。我发现它发生的原因是b转换为浮动(特定于iOS),然后a + b没有足够的精度1000.9999和(为什么? )四舍五入到更高的价值。如果a0.999f,我们会得到c = 1000 - 理论上正确的行为。

所以我的问题是为什么浮动数字四舍五入到更高的值?描述这种行为(或惯例)的地方?

我在iPhone模拟器,Apple LLVM 4.2编译器上进行了测试。

2 个答案:

答案 0 :(得分:4)

int c = a + b中,整数b首先转换为浮点数,然后转换为2浮点数 添加数字,结果被截断为整数。

默认浮点舍入模式为FE_TONEAREST,表示结果 添加

0.99999f + 1000f

最近的 号码,可以表示为浮点数,即数字1001f。然后将此浮点数截断为整数c = 1001

如果更改舍入模式

#include <fenv.h>
fesetround(FE_DOWNWARD);

然后添加的结果向下舍入(大约1000.99993f),您将获得c = 1000

答案 1 :(得分:1)

原因是当您添加1000时,您将获得8个精确的十进制数字,但IEEE float仅支持7位数。