0

最も奇妙なことが起こっています。

コード:

NSString *input = @"357835487953487345879345897345897345897534";
NSLog(@"%@", input);
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:input];
NSLog(@"%@", number);

出力:

 357835487953487345879345897345897345897534
 357835487953487345879345897345897345890000

したがって、数値は同じではありません。浮動小数点数の精度と関係があります。では、これらを等しくするにはどうすればよいでしょうか。最後の数桁をゼロに置き換えるのはなぜですか?

4

2 に答える 2

4

NSDecimalNumberのドキュメントを確認してください

NSNumber の不変サブクラスである NSDecimalNumber は、基数 10 の演算を行うためのオブジェクト指向のラッパーを提供します。インスタンスは、仮数 x 10^exponent として表現できる任意の数値を表すことができます。ここで、仮数は最大 38 桁の長さの 10 進整数であり、指数は -128 から 127 までの整数です。

コードを実行すると、38 桁目までは同じです。

357835487953487345879345897345897345897534 357835487953487345879345897345897345890000

于 2013-03-12T21:44:24.630 に答える
3

NSDecimal 数値は精度が制限されているため、数値の末尾をゼロに置き換えています...すべての数値はそうです。内部的には

357835487953487345879345897345897345897534

として保存されます

35783548795348734587934589734589734589 * 1E4

短い数字 (意味のある数字の少ない数字) では、この問題は発生しません。

ドキュメントから:

NSNumber の不変サブクラスである NSDecimalNumber は、基数 10 の演算を行うためのオブジェクト指向のラッパーを提供します。インスタンスは、仮数 x 10^exponent として表現できる任意の数値を表すことができます。ここで、仮数は最大 38 桁の長さの 10 進整数であり、指数は -128 から 127 までの整数です。

つまり、意味のある数字 (ゼロ以外の数字) を持つ数字を保持するには、他のストレージ ソリューションが必要になる場合があります。

任意精度の算術演算を探したいと思うかもしれません。ご覧ください: GMP . 多分それはあなたを助けることができます。

于 2013-03-12T21:44:41.440 に答える