NSDecimalNumber を指定して、指数 (スケール) を見つけるにはどうすればよいですか?
原則的には、最初に NSString に変換してから、醜い文字列操作を行うことでこれを行うことができるはずですが、私はそれを避けたいと思います。
Java BigDecimal を使用すると、scale()メソッドを呼び出してスケールを取得できます。
NSDecimalNumber にも同様に簡潔な方法はありますか?
NSDecimalNumber を指定して、指数 (スケール) を見つけるにはどうすればよいですか?
原則的には、最初に NSString に変換してから、醜い文字列操作を行うことでこれを行うことができるはずですが、私はそれを避けたいと思います。
Java BigDecimal を使用すると、scale()メソッドを呼び出してスケールを取得できます。
NSDecimalNumber にも同様に簡潔な方法はありますか?
何らかの理由で指数が本当に必要な場合(単に表示する以外に、数値フォーマッターを構成して提供することができます)、メソッドでプリミティブdoubleを取得してから、仮数と指数の値を取得するために-doubleValue
使用できます。frexp(3)
浮動小数点演算を実行および格納するためのオブジェクトの背後にある全体的な設計は、計算エラーと精度エラーをより効果的に処理できることですが、その設計の制限は、スカラー(double
仮数と指数の組み合わせなど)から変換した後です。 )、オブジェクトフレームワーク内にとどまり、(潜在的に)精度の低い形式に変換し直さないことが期待されます。
他の回答は変更される可能性のあるプライベート構造レコードへのアクセスを示唆しているため、を使用することをお勧めし-doubleValue
ます。これらを使用すると、実際には非常によくある場合でも、精度が低下しないことが示唆されます(ヘッダーファイルに記載されています)。doubleに変換するとき、あなたとあなたのコードを使用/読み取る人は、型が非常によく理解され、非常によく文書化されているため、どのような精度エラーが発生する可能性があるかを正確に知っています。
最後に、変換によってエラーが発生するかどうかを確認したい場合は、NSDecimalNumberHandlerを作成して使用できます。これにより、ダブルスカラー型に変換するときに予想される丸め/精度エラーの種類に関する情報が得られます。
また、アップルのバグレポーターを使用して、指数に直接アクセスしたいことを示す拡張リクエストを追加することをお勧めします。また、-longDoubleValue
メソッドなどのより高精度の型を追加することもできます。
編集には詳細情報が含まれます
あなたはそれにアクセスすることができますNSDecimal
:
int exponent = decimalNumber.decimalValue._exponent;
いいえ、 NSDecimalNumberに相当するものはないようです。自分で書いてもいいと思います。
ただし、少し掘り下げても構わない場合 (およびドキュメントの警告を無視する場合) は、返されるNSDecimal 構造-decimalValue
を調べることができます。これには、おそらくアクセスできるフィールドがいくつかあります。これが NSString 操作よりも主観的に良いか悪いかは、あなた次第です。
式を基数 10 の形式にしたい場合 (frexp(3) は基数 2 しかできないようです)、これを試すことができます:
double mantissa = [someDecimalNumber doubleValue];
int exp = 0;
if (mantissa >= 1.0f) {
while (mantissa >= 1.0f) {
mantissa = mantissa / 10.0f;
exp++;
}
} else {
while (mantissa*10.0f < 1.0f) {
mantissa = mantissa * 10.0f;
exp--;
}
}
NSLog(@"%f = %f x 10^%d", [someDecimalNumber doubleValue], mantissa, exp);
NSDecimalNumber
指数を変更して、仮数を 1 に設定して作成されたインスタンスと数を比較できます。二分探索のように機能します。