0

単純化された問題:

float0.02275があり、それを小数点以下 4 桁に丸めると、予想される代わりに が0.0228得られ0.0227ます。の浮動小数点値0.02275が のようなもの0.0227499999999999...で、小数点以下 4 桁に丸めると が得られるため、これが発生することがわかっています0.0227

float a = 0.02275;
NSLog(@"float a is %f",a);
NSLog(@"float a, rounded to 4 decimal places is %0.4f",a);
NSLog(@"float a, rounded to 10 decimal places is %0.10f",a);

出力を与える

float a is 0.022750
float a, rounded to 4 decimal places is 0.0227
float a, rounded to 10 decimal places is 0.0227499995

私の質問は、これを正しく丸めて0.0228の代わりに取得するにはどうすればよい0.0227ですか?

実際の状況の制限:

float は plist ファイルから取得されます。NSNumber floatValuevariable に代入する際に使用されますa

私のプログラムはお金とパーセンテージを扱っています。金額の値はユーザー入力であり、パーセンテージは固定値またはユーザー入力のいずれかです。上記の例のフロートは、私の計算で不正確な原因となっているパーセンテージ値の 1 つです。

4

3 に答える 3

1

お金の値を保存するためにフロートを使用しないでください。エラーは増え続けますが、これは一般的にお金では望ましくありません。整数でセントとしてお金を保管します(または、小数のセント金額を使用できる場合は10分の1セント...)。また、パーセンテージも整数として保存します。たとえば、100%=1000などの精度が必要です。

例:

$10 * 105% (logical)
= 1000 * 1050 (variable values)
= 1050000 (intermediate result)
/ 1000 (divide by numeric value of 100%)
= 1050 (final cent value)
= (double)1050/100.0 (C code to get dollars as double for printing)
于 2013-02-21T04:53:08.147 に答える
1

フォーマット演算子は切り捨てられます。丸められません。

詳細については、printfのドキュメントを参照してください。%.4fは丸めますが、0.02775は0.0277に切り捨てられ、それが表示されます。0.027751はあなたが期待する0.0278を与えると私は信じています。

于 2013-02-21T04:37:24.263 に答える
0

これは役立つかもしれません:

http://www.accuretech.com/ios-app-development-rounding-number-tips/

他の情報も提供しますが、全体として、必要なものを入手するのに役立ちます。

于 2013-02-21T04:53:21.697 に答える