0

私のアプリはこのように計算されました。

float containTaxValue = 840;
float taxRate = 5;
float divisionedNum = (100 + taxRate)/100;
float removedTaxValue = containTaxValue/divisionedNum;
float taxValue = containTaxValue - removedTaxValue;

最後に答えは

NSLog(@"%f",removedTaxValue); => 800.000061
NSLog(@"%f",containTaxValue); => 840.000000
NSLog(@"%f",taxValue); => 39.999939

このコードで「taxValue==40.000000」を取得したいと思います。

何が問題なのか理解できませんでした。アドバイスを教えてください。

4

4 に答える 4

2

IEEE 754 標準は、浮動小数点数をマシンで操作しやすい方法で格納する方法です。この方法は、プロセッサの INtel と mot で使用されます。

IEEE 754 では、ストレージ要件を軽減し、すべてのマイクロプロセッサで利用可能な組み込みバイナリ算術命令がデータを比較的高速に処理できるようにするために、数値をバイナリ形式で格納することを指定しています。ただし、単純で繰り返しのない 10 進数である一部の数値は、完全な精度で格納できない繰り返しの 2 進数に変換されます。

1/10 は 10 進数形式 .1 で表すことができます

しかし、バイナリ形式では次のようになります: .0001100011000111000111 (など)

And Hence the rounding-off error occurs.

int丸めるには、に変換する必要があります。

1.05 のバイナリ変換も 00111111 10000110 01100110 01100110....

于 2013-03-18T08:47:59.920 に答える
1

float1.05 など、多くの値を正確に表すことはできません。丸め誤差が発生し、最終結果に繰り越されます。

于 2013-03-18T08:35:14.507 に答える
0

ドットの後の数字がどれくらいの長さかわからない場合は、%.6f代わりに単純にドットの後に正確な 6 桁を出力して、関数%fを使用できる値を切り上げることができます。値は切り上げられますceil(double)

%fだけで、

float taxValue = 39.999999; // you've 6 digits after dot
NSLog(@"%f",ceil(taxValue));

出力、40.000000

%.6f

float taxValue = 39.99; // you've only 2 digits after dot but still you want to show 6 digit
NSLog(@"%.6f",ceil(taxValue));

出力、40.000000

于 2013-03-18T08:41:59.460 に答える
0

浮動小数点値を切り上げるには、次のコードを使用できます

float A,B; // this variables have to be floats!
int roundDown = floor(A/B); // rounded down
int roundUp = ceil(A/B); // rounded Up
int rounded = lroundf(theFloat); //rounded

結果の int 値は再び float に変換されます

お役に立てれば !!!

于 2013-03-18T08:52:17.557 に答える