1

重複の可能性:
CGFloat 追加のバグ?

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);
}
4

1 に答える 1

4

等しいかどうかを比較しないでください。float (または double) では機能しません。精度のニーズに合ったデルタとの差を比較してください。

これは常に 10 進数と浮動小数点数の問題です。

中学生に (1/3.0)*3.0 と聞くと、全員が 1 と答えます。コンピューターは 0.999999 と答えます。

ほとんどの 場合、それがそれに近づくことは決してないだろうとは0期待できません。0.000000

編集:

float が非常によく使用されている場合は、これを読む必要があります http://en.wikipedia.org/wiki/IEEE_754-2008

また、すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

于 2013-01-17T12:58:05.233 に答える