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
BigDecimal
Sabit ile karşılaştırmak her yürütmeyi BigDecimal.ZERO
inşa etmek zorunda new BigDecimal(0)
kalmaz.
FYI, BigDecimal
aynı zamanda sabitler BigDecimal.ONE
ve BigDecimal.TEN
size 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
equals
ve compareTo
düşü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, someValue
değ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 .ZERO
bu 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.00
yüzüncü yere hassasiyet verirken 0
, o kadar da hassas değil. Duruma bağlı kalmak isteyebilirsiniz .equals()
.
equals
ve compareTo
düşü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 selectPrice
olduğunu null
.
equals
ve compareTo
düşündüğünüz gibi değil. docs.oracle.com/javase/1.5.0/docs/api/java/math/…