%f は単純に出力を丸めます。正確な値 (つまり 4.73) が float 形式で表現されていない場合、float 値を文字列に変換して元に戻すことはできません。したがって、元に戻すと、保存された値 4.73 が float 形式に「丸められ」ます。これは明らかに 4.730…02 です。
財務計算に(バイナリ、IEEE)フロートを使用することはめったにありません。金銭的価値 (金額) は、ほとんどの場合、セントの整数値ですが、ドル (など) の浮動小数点値ではありません。さらに、精度が 2 桁のすべての値が形式に格納できるようにすることを検討してくださいNSDecimal
。NSDecimalNumber
編集:
float f = 4.73000002;
float rounded = roundf(f * 100.0f) / 100.0f;
NSLog(@"%10.10f", rounded);
出力:
2014-07-01 10:25:48.653 xctest[596:303] 4.7300000191
確認するのは難しいですが、おそらく float は 4.73 を正確に表すことはできません。最も近い表現可能な値は 4.7300000191 です。これは私が言ったことです: 丸められた 10 進数表現は、常に可能な「2 進浮動小数点数」表現であるとは限りません。多くの値でその問題に直面します。