3

初投稿はこちら。NSNumber の floatValue メソッドに問題があります -- どういうわけか、不正確な数値を返します。問題は次のとおりです。次のように、一連の NSNumbers を配列に格納します。

NSArray *a = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0.04f],
    [NSNumber numberWithFloat:0.028f], 
    [NSNumber numberWithFloat:0.016f],
    [NSNumber numberWithFloat:0.004f],
   nil];

次に、最初の値を取得しようとします (たとえば): NSNumber n = (NSNumber ) [a objectAtIndex:0]; CGFloat f = [n floatValue];

デバッガーでは、n は 0.04 の値を示しますが (要約列で)、f は 0.0399999991 の値を示します。ここで何が間違っていますか?

みんな、ありがとう。

4

1 に答える 1

3

あなたは何も悪いことをしていません。NSNumberそれは特にorの問題ではありませんCGFloat。これは、10 の累乗ではなく 2 の累乗に基づく浮動小数点数について非常に普遍的なものです。この決定的な記事またはウィキペディアの記事を読む必要があります。

ポイントは、標準の浮動小数点数は、1/2、1/4、1/8、...の合計である数値のみを正確に表すことができるということです。1/10 ではありません。したがって、標準の浮動小数点数を使用して 0.1 を完全に正確に表現することはできません。

本当にそれを処理する必要がある場合は、有理分数または 10 進浮動小数点数を処理するルーチンがあります。

于 2010-05-12T05:46:44.313 に答える