2016-04-09 4 views
0

配列を作成し、デフォルト値を0.3に設定します。これは0.29999999999999999に従って、なぜそうですか? enter image description hereデフォルト値で配列を作成しますが、デフォルト値が変更されます

+2

一般的に使用すると、浮動小数点数を比較する必要がある場合は、 'Double'を使用しないでください。小数点を 'Int'で区切るか、単に' NSDecimalNumber'を使うことができます。 – Eendje

+0

アドバイスありがとうございます! – ChildrenGreens

+0

あなたが使用すべきでないNSDecimalと混同しないでください。 – BallpointBen

答えて

4

これは、浮動小数点値のバイナリ表現によるものです。いくつかの浮動小数点値は、指定されたメモリ空間で正確に表現することはできないため、適合する値に丸められます。 thisの詳細については、この記事をチェックしてください。これを避けたい場合、ほとんどのプログラミング言語は、基数10の算術を使用するデータ型を持ち、この制限はありません。速いのはNSDecimalNumberですが、通常このデータタイプははるかに遅いことに注意してください。

+0

私はあなたの意味を理解して、あなたの説明は非常に良いです、ありがとう! – ChildrenGreens

1

実際はかなりシンプルです。ベース10のシステム(私たちのようなもの)を持っているときは、ベースの素因数を使った分数しか表現できません。 10の素因数は2と5です。したがって、分母はすべて素因数10を使用するので、1/2,1/4,1/5,1/8,1/10はきれいに表現できます。対照的に、1/3,1/6、および1/7は、それらの分母が3または7の素因数を使用するため、すべて小数点を繰り返します。バイナリ(または基底2)では、唯一の素因数は2です。主要な要素として2つしか含まれていません。バイナリでは、1/2,1/4,1/8はすべて小数点以下できれいに表現されます。一方、1/5または1/10は小数を繰り返すことになります。だから0.1と0.2(1/10と1/5)、ベース10システムでクリーンな小数点は、ベース2のシステムでは、コンピュータが動作している繰り返しです。これらの小数点以下の繰り返しで数学を行うと、あなたは残り物で終わるこれは、コンピュータのベース2(バイナリ)番号を人間が読めるベース10の番号に変換するときに引き継がれます。

詳細:

http://0.30000000000000004.com/

関連する問題