浮動小数点数は、特定の数値をうまく表現できません。double を使用すると、これが発生する頻度は低くなりますが、それでも問題は発生します。浮動小数点数の格納方法 (およびそもそもこの問題が発生する理由) の技術的な説明については、ウィキペディアの記事: IEEE 754-1985を参照してください。(基本的に、float は値のバイナリ表現として格納され、使用するビット数が非常に多いため、すぐに不足し、表現できる最も近い値に丸める必要があります。)
通常、+/- .0000001 については気にせず、適切な小数点数でユーザーに表示したい場合にフォーマットするだけで、丸められます。内部的には、それがどのように保存されているかは問題ではありません。
たとえば、「結果」を表示したい場合は、次のようにします。
float myFloat = 32 + 32.1;
NSString *result = [NSString stringWithFormat:%@"%.2f", myFloat];
// result will contain 64.10
小数点の固定数が必要ない場合は、浮動小数点から文字列への変換機能を使用することもできますNSNumber
。
float myFloat = 32 + 32.1;
NSNumber *myNumber = [NSNumber numberWithFloat:myFloat];
NSString *result = [myNumber stringValue];
// result will contain 64.1
NSDecimalNumber
がこのすべてを処理しますが、少し複雑でオーバーヘッドも増えますが、開始するための例を次に示します。
NSDecimalNumber *num1 = [NSDecimalNumber decimalNumberWithString:@"32"];
NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithString:@"32.1"];
// Or since you use exponents:
// NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithMantissa:321 exponent:-1 isNegative:NO];
NSDecimalNumber *myNumber = [num1 decimalNumberByAdding:num2];
NSString *result = [myNumber stringValue];
// result will contain 64.1