Java aşağıdaki kodu var;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
İf koşulunu yazmanın en iyi yolu nedir?
Java aşağıdaki kodu var;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
İf koşulunu yazmanın en iyi yolu nedir?
Yanıtlar:
Şunun compareTo(BigDecimal.ZERO)yerine kullanın equals():
if (price.compareTo(BigDecimal.ZERO) == 0) // see below
BigDecimalSabit ile karşılaştırmak her yürütmeyi BigDecimal.ZEROinşa etmek zorunda new BigDecimal(0)kalmaz.
FYI, BigDecimalaynı zamanda sabitler BigDecimal.ONEve BigDecimal.TENsize kolaylık sağlamak için.
Kullanamamanızın nedeni BigDecimal#equals(), ölçeği dikkate almasıdır :
new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!
bu yüzden tamamen sayısal bir karşılaştırma için uygun değildir. Ancak, BigDecimal.compareTo()karşılaştırırken ölçeği dikkate almaz:
new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true
Alternatif olarak, signum () kullanılabilir:
if (price.signum() == 0) {
return true;
}
BigDecimal.ZERO.compareTo(null)atacak
Kontrol edebileceğiniz bir sabit var:
someBigDecimal.compareTo(BigDecimal.ZERO) == 0
equalsve compareTodüşündüğünüz gibi değil. docs.oracle.com/javase/1.5.0/docs/api/java/math/…
Alternatif olarak, BigDecimal sınıfındaki eşittir ve CompareTo yöntemlerinin davranışlarının birbiriyle tutarlı olmadığını belirtmeye değer .
Bu temel olarak şu anlama gelir:
BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO)==0); //true
System.out.println(someValue.equals(BigDecimal.ZERO)); //false
Bu nedenle, someValuedeğişkeninizdeki ölçeğe çok dikkat etmelisiniz , aksi takdirde beklenmedik sonuç alırsınız.
Nesneler oldukları için equals () öğesini kullanmak ve yerleşik ZERO örneğini kullanmak istersiniz:
if(selectPrice.equals(BigDecimal.ZERO))
.equals()Ölçeğin dikkate alındığına dikkat edin , bu nedenle selectPrice aynı ölçek (0) olmadığı sürece .ZERObu yanlış döndürür.
Ölçeği denklemden olduğu gibi çıkarmak:
if(selectPrice.compareTo(BigDecimal.ZERO) == 0)
Bazı matematiksel durumlar için 0.00 != 0, bu yüzden .equals()ölçeği dikkate aldığını hayal etmeliyim . 0.00yüzüncü yere hassasiyet verirken 0, o kadar da hassas değil. Duruma bağlı kalmak isteyebilirsiniz .equals().
equalsve compareTodüşündüğünüz gibi değil. docs.oracle.com/javase/1.5.0/docs/api/java/math/…
equalsölçeği hesaba katar, bu da burada istediğimiz şey değildir.
equals gereken durumlar vardır compareTo(). OP ne tür bir matematik kullandığını belirtmiyor, bu yüzden ona her iki seçeneği de vermek daha doğru.
GriffeyDog kesinlikle doğrudur:
Kod:
BigDecimal myBigDecimal = new BigDecimal("00000000.000000");
System.out.println("bestPriceBigDecimal=" + myBigDecimal);
System.out.println("BigDecimal.valueOf(0.000000)=" + BigDecimal.valueOf(0.000000));
System.out.println(" equals=" + myBigDecimal.equals(BigDecimal.ZERO));
System.out.println("compare=" + (0 == myBigDecimal.compareTo(BigDecimal.ZERO)));
Sonuçlar:
myBigDecimal=0.000000
BigDecimal.valueOf(0.000000)=0.0
equals=false
compare=true
Ben BigDecimal karşılaştırmanın avantajlarını anlasam da, sezgisel bir yapı olarak düşünmüyorum (==, <,>, <=,> = operatörleri gibi). Kafanızda bir milyon şey (tamam, yedi şey) tutarken, bilişsel yükünüzü azaltabileceğiniz her şey iyi bir şeydir. Bu yüzden bazı kullanışlı kolaylık fonksiyonları oluşturdum:
public static boolean equalsZero(BigDecimal x) {
return (0 == x.compareTo(BigDecimal.ZERO));
}
public static boolean equals(BigDecimal x, BigDecimal y) {
return (0 == x.compareTo(y));
}
public static boolean lessThan(BigDecimal x, BigDecimal y) {
return (-1 == x.compareTo(y));
}
public static boolean lessThanOrEquals(BigDecimal x, BigDecimal y) {
return (x.compareTo(y) <= 0);
}
public static boolean greaterThan(BigDecimal x, BigDecimal y) {
return (1 == x.compareTo(y));
}
public static boolean greaterThanOrEquals(BigDecimal x, BigDecimal y) {
return (x.compareTo(y) >= 0);
}
Bunları nasıl kullanacağınız aşağıda açıklanmıştır:
System.out.println("Starting main Utils");
BigDecimal bigDecimal0 = new BigDecimal(00000.00);
BigDecimal bigDecimal2 = new BigDecimal(2);
BigDecimal bigDecimal4 = new BigDecimal(4);
BigDecimal bigDecimal20 = new BigDecimal(2.000);
System.out.println("Positive cases:");
System.out.println("bigDecimal0=" + bigDecimal0 + " == zero is " + Utils.equalsZero(bigDecimal0));
System.out.println("bigDecimal2=" + bigDecimal2 + " < bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThan(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThanOrEquals(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal4=" + bigDecimal4 + " > bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThan(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal4=" + bigDecimal4 + " >= bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThanOrEquals(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal20=" + bigDecimal20 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal20));
System.out.println("Negative cases:");
System.out.println("bigDecimal2=" + bigDecimal2 + " == zero is " + Utils.equalsZero(bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal4=" + bigDecimal4 + " is " + Utils.equals(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal4=" + bigDecimal4 + " < bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThan(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal4=" + bigDecimal4 + " <= bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThanOrEquals(bigDecimal4, bigDecimal2));
System.out.println("bigDecimal2=" + bigDecimal2 + " > bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThan(bigDecimal2, bigDecimal4));
System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal4));
Sonuçlar şöyle görünür:
Positive cases:
bigDecimal0=0 == zero is true
bigDecimal2=2 < bigDecimal4=4 is true
bigDecimal2=2 == bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal4=4 is true
bigDecimal4=4 > bigDecimal2=2 is true
bigDecimal4=4 >= bigDecimal2=2 is true
bigDecimal2=2 >= bigDecimal20=2 is true
Negative cases:
bigDecimal2=2 == zero is false
bigDecimal2=2 == bigDecimal4=4 is false
bigDecimal4=4 < bigDecimal2=2 is false
bigDecimal4=4 <= bigDecimal2=2 is false
bigDecimal2=2 > bigDecimal4=4 is false
bigDecimal2=2 >= bigDecimal4=4 is false
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));
0'ı temsil eden statik bir sabit vardır :
BigDecimal.ZERO.equals(selectPrice)
Bunu aşağıdakiler yerine yapmalısınız:
selectPrice.equals(BigDecimal.ZERO)
durumdan kaçınmak için nerede selectPriceolduğunu null.
equalsve compareTodüşündüğünüz gibi değil. docs.oracle.com/javase/1.5.0/docs/api/java/math/…