1

私のiPhoneアプリケーションでは、ユーザーは設定で単位(kmまたはmile)を変更できます。

[[NSUserDefaults standardUserDefaults] setObject:@"km" forKey:@"distanceUnit"];

また

[[NSUserDefaults standardUserDefaults] setObject:@"mile" forKey:@"distanceUnit"];

Core-Dataに距離をkm単位で保存します。私はintで動作します。したがって、距離を取得するたびに、次のことを行います。

if ([unit isEqualToString:@"km"]) {
} else {
    intTotalKM = intTotalKM * 0.621371192;
} 

そして、距離を節約するとき、私は次のことをします:

if ([unit isEqualToString:@"km"]) {
} else {
    intTotalKM = intTotalKM / 0.621371192;
}

たとえば、距離を変えずに保存して取得すると、1〜2km/マイルを失います。

0.621371192と、 intのみを使用しているため、精度が低下します。double値を使用したくありません。この問題に対処する方法について何かアイデアはありますか?

編集:私の状況により適した変換の他の方法があるかどうか疑問に思います。

ありがとう。

4

4 に答える 4

3

損失のない唯一の解決策は、距離をネイティブ単位で保存することです。距離を表す単位を指定する1文字の列を追加し、実際の距離とともにコード(たとえば、マイルの場合とマイルの場合)'K'km格納します。'M'

列を追加するオプションがない場合は、格納する数値の上位ビットに単位を配置できます。アプリの最大距離はで2^20あるため、数値の残りの12ビットを使用して単位をエンコードできます。距離が表されます。dist & 0xFFFFF実際の距離dist >> 20を抽出し、単位コード(1for km0for )を抽出するために使用しmiます。

于 2012-11-24T14:28:33.273 に答える
2

本当に整数を維持し、精度を維持したい場合は、より小さな単位を使用してください。999999kmの最大要件では、整数が32ビットの場合、値をメートル単位で格納し、変換を調整してヤードを生成できます。整数が64ビットの場合は、cmまたはmmを使用できますが、おそらくそれほど遠くまで行く必要はありません。これは、いくつかの財務計算が行われる方法です。たとえば、1.59ドルは1.59としてではなく、159として保存されます。

于 2012-11-24T18:20:46.000 に答える
2

数値を1回変換することによる精度の低下が許容できる場合は、表示/保存するたびに前後の変換を停止し、必要に応じて、ユーザーが値を入力したときにのみ変換します。 。

つまり、ユーザーのデフォルトと同じように、メモリ内の値のみがkmを表します。

- (void)textFieldDidEndEditing:(UITextField *)textField {
    intTotalKM = [textField.text intValue];

    if ([unit isEqualToString:@"mile"]) {
        intTotalKM = intTotalKM / 0.621371192;
    }
}

この変換は、ユーザーが新しい値を入力したときに1回だけ行われることに注意してください。

値をユーザーに表示するには、必要に応じて値をマイルに変換します。値を保存するときは、常にKMに保存されるため、変換を行わずにintTotalKMを保存するだけです。

それ以外の場合は、この精度の低下が発生しないように値を保存する必要があります。他の回答で提案されているように、数値の小数部分を保存する(doubleを使用)、別の単位として保存する(メートルなど、私の個人的なお気に入り)、または単位を保存してネイティブ値を使用する。

于 2012-11-26T22:58:09.147 に答える
1

あなたは自分で質問に答えました:整数を使用しているために精度が失われます...選択肢はあまりありません。doubleに変更するか、intおよび不正確な値を使用します...

于 2012-11-24T14:04:01.860 に答える