2017-07-13 3 views
0

私はプロジェクトでfloat値を使用しています。私がProjectでアクセスしようとすると、それは10進数で1/10億に拡大しますが、それが遊び場になると完全に動作します。 xcodeprojでSwiftのプロジェクトで浮遊価値が丸められているのはなぜですか?

遊び場で

let sampleFloat: Float = 0.025 
print(sampleFloat) // It prints 0.0250000004 

let sampleFloat: Float = 0.025 
print(sampleFloat) // It prints 0.025 

ここで何が起こっている任意の手掛かり? xcodeprojの拡張を避けるにはどうすればよいですか?

+0

どのバージョンのXcode/Swiftを使用していますか? Xcode 8.3.3を使用したiOSプロジェクトビルドから** '0.025' **を取得します。とにかく、 'Float'からの出力を特に丸めたいのであれば、' NumberFormatter'を使うのが良いでしょう。 'print'からの出力は明確に定義されておらず、Swiftの将来のバージョンで変更されるかもしれません。 – OOPer

+0

私はXCode 8.3.3を使用していますが、計算でも0.0250000004と同じ結果になります。 –

+0

奇妙な挙動です。これは、 'print'の出力に頼るべきではないことを示唆しています。ちなみに、計算ではどういう意味ですか? – OOPer

答えて

1

コメントはたくさんありますが、誰もまだすべての情報を回答として投稿していません。答えは内部、浮動小数点数は、ベース10 2.

のバイナリ累乗で表されていることを

、十の桁の値であるか多くの1/10ths表します。 100番目の桁は値の1/100を表し、1000番目の桁は値に含まれる1/1000番目の桁を表します。基数10では、正確に1/3を表すことはできません。つまり、0.33333333333333333 ...

バイナリ浮動小数点数では、最初の小数点以下の2進数は、値に含まれる1/2の数を表します。 2番目の桁は、1/4thの値が何番目にあるかを表し、次の桁は値の1/8の数を表します。バイナリ浮動小数点で正確に表すことができないいくつかの(多くの)10進値があります。値0.1(1/10)はそのような値の1つです。それは1/16 + 1/32 + 1/256 + 1/512 + 1/4096 + 1/8192のように近似されます。

値0.025は、2進浮動小数点で正確に表現できない別の値です。

数字を表すために10進数字を使用するNSDecimalNumberDecimal Swift 3)の代替番号書式があるため、10進値を正確に表すことができます。 (ちょうど1/3のような小数部分はまだ表現できないことに注意してください)

+0

なぜ彼の場合遊び場とプロジェクトには違いがあります。 –

+0

詳細な説明をお寄せいただきありがとうございます。浮動小数点値を使用するように見えますが、これらのエッジケースの計算が必要です。 –

関連する問題