0

非常に大きなdouble数をint(またはlongまたはlong long)に変換しようとしていますが、いくつかの問題があります。ほとんどの場合、変換は良好ですが、場合によっては変換されません。

私のコード:

double price = 12345678.900000;
double hundredNumber = price * 100;
NSNumber *number = [NSNumber numberWithDouble:hundredNumber];
int tempNumber = [number intValue];

tempNumberまで、すべてうまくいきます。1234567889からログアウトしますが、1234567890である必要があります(... 89 -... 90)なぜそれが発生する可能性があり、正しく変換する方法を知っている人はいますか?

PS私は値にバックスペースを実装しようとしています(例:123.45、その後は12.34になるはずです)。多分誰かがこのような何かを実装しましたか?

4

2 に答える 2

2

浮動小数点数を使用している場合、丸め誤差のリスクが常に発生します。

常に価格を として保存しないのはなぜlong longですか?

つまり、£5.50 の代わりに、550p を保存します。そうすれば、丸めの問題はまったく発生しません。

于 2012-10-15T14:06:07.230 に答える
0

コメントしたように、エラーの可能性があるため、丸めには注意します。

考えられる解決策の 1 つは、Google が Android の座標で行うように double を使用することです: 1E6 を乗算します。整数で操作すると、倍精度で操作するよりもはるかに多くの CPU サイクルを安全に使用できます。これを試してください:

double priceDouble = 33.f / 34.f;
NSLog(@"double: %f", priceDouble);

NSInteger priceInteger = (NSInteger)(priceDouble * 1E6);
NSLog(@"int: %d", priceInteger);

NSNumber * priceNumberWithDouble = [NSNumber numberWithDouble:priceInteger];
priceDouble = [priceNumberWithDouble doubleValue];
NSLog(@"double: %f", priceDouble);

NSNumber * priceNumberWithInteger = [NSNumber numberWithInteger:priceInteger];
priceInteger = [priceNumberWithInteger integerValue];
NSLog(@"int: %d", priceInteger);

double test = ((double)priceInteger)/1E6;
NSLog(@"Test: %f",test);

私の出力は次のとおりです。

double: 0.970588
int: 970588
double: 970588.000000
int: 970588
Test: 0.970588
于 2012-10-15T15:12:15.203 に答える