2

次のコードを使用する場合:

- (NSString*)formatToCurrency:(float)inFloat {
  NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
  [currencyFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
  [currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
  [currencyFormatter setMaximumFractionDigits:2];
  [currencyFormatter setLocale:[NSLocale currentLocale]];

  NSNumber *x = [NSNumber numberWithFloat:inFloat];
  return [NSString stringWithFormat:@"  %@", [currencyFormatter stringFromNumber:x]];
}

コードを呼び出すときに 203500 を渡すと、出力が $203,500.02 になります。

何が起こっているのかについていくつかの考えを聞きたいです。

ありがとう、

マット

編集: XCode は、デバッガーで表示したときに 203500 を報告していましたが、float を NSString に変換すると、203500.018 も表示されます。つまり、問題はフロートにあり、NSNumberFormatter にはありませんでした。

4

2 に答える 2

6

float を使用して NSNumber を作成しています。浮動小数点数には常に丸め誤差が発生する可能性があります

すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

NSDecimalsNSDecimalNumbersに慣れる必要があります。

Cocoa は私の GF: NSDecimalNumber で怠惰にならないでください (私のように)

于 2012-11-04T21:20:47.430 に答える
0

明らかに、私はこれについて学ぶことがたくさんあります。しかし、さらに色あせてしまうリスクを冒して、私を助けてくれた1つのことを報告します。

私はこのコードを持っていました:

self.myDollarFormat.roundingIncrement = [NSNumber numberWithFloat:roundingInc];
return [self.myDollarFormat stringFromNumber:[NSNumber numberWithFloat: dollars]];

そして、roundingIncrementが0.1の638198.2は、@"$638,198.21"を生成していることがわかりました。

floatの代わりにdoubleを使用するようにコードを変更したところ、期待どおりの結果が得られました。

self.myDollarFormat.roundingIncrement = [NSNumber numberWithDouble: roundingInc];
return [self.myDollarFormat stringFromNumber:[NSNumber numberWithDouble: dollars]];

私はもっ​​と知っている人に任せますが、少なくともこれが私のために働いたと言っておきたいと思いました。幸運を。

于 2012-11-04T23:14:43.300 に答える