在这种情况下:
float a = 0.99999f;
int b = 1000;
int c = a + b;
结果c = 1001
。我发现发生这种情况是因为 b
被转换为 float (特定于 iOS),然后 a + b
对于 1000.9999
没有足够的精度和(为什么?)四舍五入到更高的值。如果a
是0.999f
,我们得到c = 1000
——理论上是正确的行为。
所以我的问题是为什么 float 四舍五入到更高的值?哪里描述了这种行为(或约定)?
我在 iPhone 模拟器、Apple LLVM 4.2 编译器上对此进行了测试。
最佳答案
在int c = a + b
中,整数b
先转换为 float ,然后转换为2个 float
数字相加,结果被截断为整数。
默认的浮点舍入模式是FE_TONEAREST
,这意味着结果
添加的内容
0.99999f + 1000f
是可以表示为 float 的最近数字,即数字1001f
。然后,该 float 被截断为整数 c = 1001
。
如果更改舍入模式
#include <fenv.h>
fesetround(FE_DOWNWARD);
然后将加法结果向下舍入(大约为 1000.99993f
),您将得到 c = 1000
。
关于ios - 当 [int] = [float] + [int] 时舍入(Obj-C、iOS?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15832804/