2011-11-10 33 views
25

Olası Çoğalt:
How to resolve a Java Rounding Double issueJava'da iki çift değer nasıl karşılaştırılır?

Java iki çift değerlerin basit bir karşılaştırma bazı sorunlar yaratır. Java'da aşağıdaki basit kod snippet'ini düşünelim.

package doublecomparision; 

final public class DoubleComparision 
{ 
    public static void main(String[] args) 
    { 
     double a = 1.000001; 
     double b = 0.000001; 

     System.out.println("\n"+((a-b)==1.0)); 
    } 
} 

Yukarıdaki kod true, ifade ((a-b)==1.0) değerlendirmesini dönmek görünüyor ama öyle değil. Bunun yerine false döndürür, çünkü bu ifadenin değerlendirilmesi 1.0 olan ve 1.0 için eşit olması beklenen 0.9999999999999999 olduğundan, koşul false boolean olarak değerlendirilir. Böyle bir durumun üstesinden gelmenin en iyi ve önerilen yolu nedir?

+6

Bunun nedeni, ikilinin ve şamandıranın her sayısal değeri ifade edememesidir. Değeri temsil etmek için gerçekten yaklaşımı kullanıyorlar. – onit

cevap

53

bakmak Referans için

, böyle bir şey yapmalıdır:

double a = 1.000001; 
double b = 0.000001; 
double c = a-b; 
if (Math.abs(c-1.0) <= 0.000001) {...} 
+7

Double'in karşılaştırma yöntemine bir göz atmak isteyebilirsiniz. Bu bağlantıyı kontrol edin: http://www.tutorialspoint.com/java/lang/double_compare.htm –

+12

Ancak, Double.compare kullanıyorsanız, (1) d1 ve d2'nin her ikisi de Double.NaN'ı temsil ettiğine dikkat edin. Double.NaN == Double.NaN false değerine sahip olsa bile true değerini döndürür; ve (2) d1, -0.0 değerini temsil ederken +0.0 ise ya da tam tersi ise, yöntem +0.0 == - 0.0 değeri true olsa bile false değerini döndürür. Bu tanım, karma tabloların düzgün şekilde çalışmasını sağlar. – shiggity

8

Ondalık aritemetik için ikilileri kullanmak yerine, lütfen java.math.BigDecimal kullanın. Beklenen sonuçları üretecektir. Temelde kesin karşılaştırmalar yapmaması gereken bu stackoverflow question

+14

BigDecimal bazen uygun bir çözüm değildir. – mcfinnigan

İlgili konular