Karşılaştırmaya () karşılık BigDecimal eşittir ()


158

Basit test sınıfını düşünün:

import java.math.BigDecimal;

/**
 * @author The Elite Gentleman
 *
 */
public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BigDecimal x = new BigDecimal("1");
        BigDecimal y = new BigDecimal("1.00");
        System.out.println(x.equals(y));
        System.out.println(x.compareTo(y) == 0 ? "true": "false");
    }

}

Bunun (bilinçli olarak) bunun xeşit olduğunu y(nesne başvurusu değil ) diyebilirsiniz , ancak programı çalıştırdığınızda aşağıdaki sonuç gösterilir:

false
true

Soru: arasındaki fark nedir compareTo()ve equals()de BigDecimalo compareToolduğunu belirleyebilir xeşittir y?

Not: BigDecimal'ın inflate()yöntemde bir yöntemi olduğunu görüyorum equals(). inflate()Aslında ne yapar ?


1
Reklam inflate(): herkese açık API'nın bir parçası değildir, çünkü yalnızca dahili temsili manipüle eder ve "dış" için görünür bir etkisi yoktur. Bu yüzden, gerçekten BigDecimalderinlemesine uygulamayı incelemek istemiyorsanız , bu yöntemi görmezden gelmenizi öneririm.
Joachim Sauer

Kısa bir açıklama ve kaynak kod snippet'lerini burada bulabilirsiniz
xenteros

Yanıtlar:


225

Yanıt, yöntemin JavaDoc dosyasındadırequals() :

Bunun aksine compareTo, bu yöntem iki BigDecimalnesneyi yalnızca değer ve ölçek açısından eşit olduklarında eşit kabul eder (bu nedenle bu yöntemle karşılaştırıldığında 2.0 2.00'e eşit değildir).

Başka bir deyişle: nesnelerin her açıdan tamamen aynı equals()olup olmadığını kontrol eder . "only", sayısal değerlerini karşılaştırır.BigDecimalcompareTo()

Gelince neden equals() bu şekilde davranır, bu yanıtlandı bu SO söz konusu .


24
BigDecimalJavaDoc'u dikkatli bir şekilde okumuyorsanız, bu çok zor bir bölümdür . :) - Farkı anlayana kadar bundan garip hatalar aldık.
Thomas

3
Standart API'nin birçok kısmı, sezgisel olan şey doğru olmayacaksa "istemeden" hareket eder. BigDecimalböyle bir şeydir. Bu nedenle JavaDoc her zaman kontrol edilmelidir. En azýndan garip bir ţeyler olduđunu öđren.
Joachim Sauer

7
Komik. Cevabınızı okuduktan sonra ben sadece Karşılaştırılabilir kontrol ve eşittir "şiddetle tavsiye edilir (ama gerekli değildir)"
SJuan76


8
@StephenC Bu tutarsızlığın varlığının yanlış olduğunu düşünüyorum .
Matt R

1

BigDecimal eşittir () yöntemi üzerinde bir inflate () yöntemi olduğunu görüyorum. İnflate () aslında ne yapar?

Temelde, inflate()çağrılar BigInteger.valueOf(intCompact)gerekirse, bu bir olarak depolanır ölçeklenmemiş değer yaratır, yani BigIntegergelen long intCompact. Buna ihtiyacınız yoksa BigIntegerve ölçeklendirilmemiş değer bir long BigDecimalyere sığarsa, alandan mümkün olduğunca uzun süre tasarruf etmeye çalışıyor gibi görünüyor.


Ne yazdığına dair hiçbir fikrim yok (özellikle son cümleyle).
Buhake Sindi

Elit Gentlement Son cümle, içsel BigDecimalolarak ölçeklenmemiş değerini longa BigInteger. Eğer BigIntegeriçten gerekli değildir oluşturulduktan değildir, ancak gerekirse (örneğin zaman equalskarşılaştığı şişirilmiş ve olmayan şişirilmiş BigDecimal) inflate () `onu oluşturmak için kullanılır - O Özetle:. inflate()Saplar iç dönüşümleri gerekirse ve onunla beri özel
Thomas

1

Doğru cevabın iki sayıyı (BigDecimals) yapmak, aynı ölçeğe sahip olmak olduğuna inanıyorum, o zaman eşitliklerine karar verebiliriz. Örneğin, bu iki sayı eşit mi?

1.00001 and 1.00002

Peki, ölçeğe bağlı. 5 ölçeğinde (5 ondalık puan), hayır aynı değildir. ancak daha küçük ondalık hassasiyetlerde (ölçek 4 ve daha düşük) bunlar eşit kabul edilir. Bu yüzden iki sayının ölçeğini eşitlemenizi ve sonra karşılaştırmanızı öneririm.


-10

Ayrıca çift değerle karşılaştırabilirsiniz

BigDecimal a= new BigDecimal("1.1"); BigDecimal b =new BigDecimal("1.1");
System.out.println(a.doubleValue()==b.doubleValue());

5
Lütfen bu çözümden mümkün olduğunca kaçının. Çiftler bile "epsilon" ile karşılaştırılmalıdır. BigDecimal'e sahip olmanın ve çiftler olarak karşılaştırmanın bir anlamı yok ... çok yüksek bir olasılık var, kendi bacağınızı vurursunuz.
Vadim Kirilchuk

Çift değerler epsillons kullanılarak karşılaştırılmalıdır
Bishwajit Purkaystha
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.