CGFloat的乘法和除法以及精度的损失

时间:2013-01-17 12:50:26

标签: iphone ios cocoa-touch math

  

可能重复:
  CGFloat addition bug?

我有一些代码,我正在进行大量的CGFloats的乘法和除法,以便找出正确的变换维度。我有时会注意到,当我想要得到320的值时,我会得到320.00000092。任何人都可以解释为什么会发生这种情况以及如何纠正它?这是假设这样做的吗?下面是一些示例代码,可能会出现问题:

- (void) setMinimumSize
{
    CGSize superViewSize = self.superview.bounds.size;
    CGSize size = self.frame.size;

    CGFloat xScale = superViewSize.width / size.width;
    CGFloat yScale = superViewSize.height / size.height;

    CGFloat minimumScale = MIN(xScale, yScale);
    self.minimumSize = CGSizeMake(size.width * minimumScale, size.height * minimumScale);
}

- (void) scaleToMinimumSize
{
    self.transform = CGAffineTransformScale(self.transform, self.minimumSize.width / self.frame.size.width, self.minimumSize.height / self.frame.size.height);
}

1 个答案:

答案 0 :(得分:4)

不要比较相等,不适用于float(或double),而不是比较 与某些适合您准确性需求的增量差异

这始终是十进制和浮点数的问题。

问一个中学生(1 / 3.0)* 3.0,都会说1.计算机说0.999999。

你不能指望,0大多数情况下0.000000永远不会接近{{1}}。

编辑:

如果浮动使用太多,你应该阅读这个 http://en.wikipedia.org/wiki/IEEE_754-2008

还有What Every Computer Scientist Should Know About Floating-Point Arithmetic