6

浮動小数点数を簡単かつ安全に修正できる方法があるかどうか疑問に思っています。

例えば、

入力時:「32+32.1」 結果:「64.0999999999999」

また、科学表記法を使用する場合、これは非常に頻繁に発生することにも言及する必要があります。" ( 2.3 * 10^23)*(1.452 * 10^23) " 戻り値: " 3.339599999999999999e+46"

最後に、次のような数値が返されることがあります。123.0000000000001

助けてくれてありがとう!

編集

承認された回答は素晴らしいです。しかし、私がうまくいったのは、NSString stringWithFormat で double を使用して %g を使用することでした。%g は、すべてを適切に丸めているようです。元。

    answer.text = [NSString stringWithFormat@" %g ", doubleAnswer];

計算で double を使用し、その方法を使用することは私にとってはうまくいくようでした。これが他の人にも役立つことを願っています。これが探している回答でない場合は、承認済みの回答を確認してください。

4

2 に答える 2

8

浮動小数点数は、特定の数値をうまく表現できません。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
于 2012-04-06T21:39:44.437 に答える
2

浮動小数点数は単に必要な数値を表すことができないため、浮動小数点数を「修正」することはできません。

浮動小数点数は非常に不正確であり、累積誤差が壊滅的に悪いことが多いため、通常、多くの計算を伴うものには使用しないでください。

double代わりにaを使用してください。それらははるかに広い範囲の値を表すことができ、その結果、より多くの値を非常に正確に表すことができます。それが十分でない場合は、より精度の高いものに移行する必要があります。おそらくNSDecimalNumber

于 2012-04-06T21:38:18.627 に答える