次の2行の出力は、NSStringのstringWithFormatステートメントが一貫して数値を丸めていないことを示しているようです。0.75から0.8に正しく切り上げられているようです。ただし、0.25は0.2に切り捨てられます。これがコードです。
NSString *sRoundedScore = [NSString stringWithFormat:@"%.1f", fScore];
NSLog(@"\r\n score before rounding: %f, rounded score: %@", fScore, sRoundedScore);
fScoreが0.25に割り当てられている場合、出力は次のようになります。
score before rounding: 0.250000, rounded score: 0.2
fScoreが0.75に割り当てられている場合、出力は次のようになります。
score before rounding: 0.750000, rounded score: 0.8
これを一貫して切り上げるには、NSNumberFormatterの使用を開始する必要がありました。stringWithFormatが結果にこのバリエーションを生成するのはなぜですか?
この答えは「printf」機能に戻ります
バンカーの丸め:
これは、浮動小数点整数の小数点以下1桁を表示することをより明確に示していることを知っておくことが重要です。
小数点以下1桁を指定しているので、小数点以下2桁を調べて、四捨五入する場所を決定します。%.f format'erの丸めロジックは、次のように機能します。直前の数値が4未満の場合、5が切り捨てられ、直前の数値が4で、5を超える場合は切り上げられます。
この理由:http://linuxgazette.net/144/misc/lg/a_question_of_rounding_in_issue_143.html: "GNU Cライブラリの場合、printf()で使用される丸め規則は「バンカー丸め」または「偶数に丸める」です。これC99仕様では、10進数への変換では、現在選択されているIEEE丸めモード(デフォルトのバンカー丸め)を使用する必要があると規定されているため、他のCライブラリよりも正確です。」
この回答から見つかりました:doubleのprintf丸め動作
上記の一般的な丸めラウンドをインラインで実行する場合は、c関数round()を少し計算して使用するか、前述のようにNSNumberFormatterを使用するだけです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加