2

わかりました、これはまったく意味がありません:

NSNumber を作成します。

NSNumber *n = [NSNumber numberWithInt:37669178];  

次に、値を整数と浮動小数としてエコーします。

int i = [n intValue];  
float f = [n floatValue];

それらの値は次のとおりです。

int: 37669178  
float: 37669176.000000

は!?!?!

なぜこれが起こっているのか、それを回避する方法を誰かが私に説明してもらえますか. これは確かに精度の問題ではありません。37,669,178 は float の精度の範囲内です。

ありがとう、
ダグ

アップデート

OK、今、私は完全に混乱しています。math.h の参照

#define MAXFLOAT    ((float)3.40282346638528860e+38)

整数値 37669178 は 3.7669178e+7 であり、最大許容浮動小数点値の範囲内です。したがって、[n floatValue] は 37669176.0 ではなく37669178.0を返す必要があります。

ここで何が欠けていますか?

4

2 に答える 2

8

float の精度は 23 ビット ( rangeと混同しないでください) しかなく、これは約 7 桁の有効数字です。doubleこれ以上の精度が必要な場合に使用します。

すべてのプログラマーが浮動小数点について知っておくべきこと

于 2010-03-10T21:37:45.960 に答える
0

目前の主題に関連して: NSNumber は、精密な数学演算を行うことを意図したものではありません。これは、数値をオブジェクトにラップする手段にすぎません。精度が必要な場合は、代わりに NSDecimal を使用する必要があります。

于 2010-03-11T00:14:46.490 に答える