2016-09-10 12 views
2

VSダブル: -グルーヴィー - 混乱私は二つの文の下に使用しているフロート

double foo = 20.00 
float bar = 20.00 
println foo == bar 

そして

double foo = 20.01 
float bar = 20.01 
println foo == bar 

それのように出力を与える: -

true 
false 

誰もが知っていることができますこれら2つのステートメントの違いは何ですか?

+0

私の答えは、あなたの疑問を解決していますか?それともまだ明確になっていないことはありますか? :) –

+0

@JoseIgnacioAcinPozoいいえ、あなたの答えは良い、本当に有用です、私はちょうど他の入力を待っています。ありがとう –

答えて

1

20.01の0.1部分は2進で無限に繰り返されます。 20.01 =

10100.00000010100011110101110000101000111101011100001010001111010111 ...

浮動小数点は24の有効ビットに四捨五入されています。ダブルスフロート

10100.0000001010001111011

と小数で二重

10100.000000101000111101011100001010001111010111000011

をなす53に丸められ、それらは、それぞれ

20.0100002288818359375と

20.010000000000001563194018672220408916473388671875です。

(あなたはこれが直接私のdecimal to floating-point converterを使用して見ることができました。)

+0

この回答は、 'float'と' double'で表現された20.01の間の低レベルの違いに関する追加情報を追加しますが、なぜ20.00が 'true'出力を与え、20.01が' false'出力を出すのかという直接的な質問には答えません。 –

+0

@JoseIgnacioAcinPozo 20は整数なので、どの形式でも正確に表現されます。 20.01は浮動小数点値か浮動小数点値かによって異なります。 (答えに明示的には言及していません。) –

+0

いい気持ちはありません!私は本当の質問の目的を指摘していただけで、あなたはいつもあなたの答えを編集することができます。私の答えは次のとおりです。「残りの表現は、常に倍となり、倍数と浮動小数点の間には小さな違いがあります。私は、文章は、浮動小数点と二重引用符の間に価値の違いがあるということを十分に明示していると思います。特に、1つは32ビットで表され、もう1つは64ビットで表されます。 –

4

doubleおよびfloat値はすべての値に対して正確な内部表現を持っていません。小数点以下2桁のIEEE-754バイナリ浮動小数点として表すことができる唯一の小数点の値は、0,0.25,0.5,0.75、および1です。残りの表現は、常にわずかにオフになり、倍精度と浮動小数点の差はわずかですこの不平等行動。

これはGroovyでは有効ではありませんが、Javaでも有効です。例えば

double foo = 20.25 
float bar = 20.25 
println foo == bar 

出力:

1

Groovyのフロートが正確にメモリに保持されていません。それがあなたの持つ違いの主な原因です。

グルービーで

以下のメソッドシグネチャによって達成することができるドットの右側の桁数によって精度の定義:

公共フロートTRUNC(INT精度)
精度 - 保持する小数点以下の桁数

詳細については、Class Float documentationに従ってください。

Groovy言語を使用する場合は、浮動小数点数としてBigDecimalクラスを使用する方が便利です。 NumberからStringへの変換はずっと簡単で、コンストラクターで浮動小数点数**の精度を定義するオプションがあります。

のBigDecimal(BigIntegerのunscaledVal、INTスケール) BigDecimalにBigIntegerのスケールなしの値とintのスケールを変換。

詳細については、Java BigDecimal documentationに従ってください。 Groovy言語はJava言語に基づいているためです。 BigDecimalを超える値は、数値の正確な値を表します。

関連する問題