iPhone / Obj C:为什么将float转换为int:(int)float * 100不起作用?

时间:2011-01-18 17:20:57

标签: iphone objective-c floating-point int

在我的代码中,我使用float来进行货币计算,但是舍入产生了不希望的结果,所以我试图将它全部转换为int。由于对基础架构的改变尽可能少,在我的init函数中,我做到了这一点:

-(id)initWithPrice:(float)p;
{
[self setPrice:(int)(p*100)];
}

我在主要部分乘以100 b / c,值为.xx到2位小数。我异常地注意到,对于浮点数1.18,int将其舍入为117.有人知道它会这样吗?漂浮物离开它为1.18。我希望以美分为单位的等值为118。

感谢。

1 个答案:

答案 0 :(得分:4)

浮点总是有点不精确。使用IEEE浮点编码,可以精确表示2的幂(如4,2,1,0.5,0.25,0.125,0.0625,...),但是像0.1这样的数字总是近似值(只​​是尝试将其表示为和2)的权力。

你的(int)演员会截断任何内容,所以如果p * 100由于这种不精确而解析为117.9999995,则会变为1.17而不是1.18。

更好的解决方案是在p * 100上使用像roundf这样的东西。如果你可以在整个程序中使用整数进入上游并完全转换为定点数学,那就更好了。