-1

重複の可能性:
100 を掛けると謎の計算エラー

これが私が直面している奇妙な問題です。値 .6 を float 変数に格納します。これに 100 を掛けると、60.000004 という間違った答えが返ってきます。これが私のコードです

NSlog(@"%f",self.dataHandler.correctPercentage * 100);
if (self.obj.percentage >= (self.dataHandler.correctPercentage * 100) )
{
    //Do something
}

self.dataHandler.correctPercentage に格納されている私の値は .6 です。しかし、NSlog を実行すると、60.000004 が返されます。これにより、境界条件がうまくいきません。

なぜこうなった?

4

3 に答える 3

6

これは丸め誤差です。数値は 10 進数ではなく 2 進数で格納されます。有限数の 2 進数で正確にエンコードできる分数は、10 進数で正確にエンコードできる分数と同じではありません。

10 進数の問題の例として、1/3 を考えてみましょう。1/3 を 0.333 にエンコードすると、(1/3)*3 = 0.999 になります。バイナリにも同じ問題があります。

10 進数を 10 進数形式で正確にエンコードする必要がある場合は、そのNSDecimalNumberために設計された which を使用する必要があります。

于 2012-08-23T13:54:12.927 に答える
1

コンピュータは、丸め誤差なしではほとんどの浮動小数点数を保存できません。これは、特に等値チェックにいくつかの意味を持ちます — たとえ純粋な数学があなたにそう思わせたとしても、フロートは等しくない傾向があるためです.

数学では、数値には格納する無限のスペースがあり、無限の桁数を使用できます。しかし、コンピューターはリソースが限られているため、無限を扱うことはできません。

What Every Computer Scientist Should Know About Floating-Point Arithmetic (少なくとも最初の数段落)を読む必要があります。

昨日、同様の問題が発生するコードも確認しました。電池残量/14961#14961

于 2012-08-23T13:54:56.087 に答える
-1

%f、Float変数はポイントの後に6つの値を格納します。コンピューターが浮動小数点数を処理する必要がある場合、それらを算術コプロセッサーにスローします。浮動小数点数を処理する場合、いくつかの影響があります。

正確な答えを得るには、それをIntに変換するか、明示的なラウンド関数または浮動小数点数の含意を解くアルゴリズムを使用してください。最適なものはアプリケーションによって異なります。

Objective-Cに関しては、NSDecimalNumberを利用できます。

于 2012-08-23T14:02:08.470 に答える