मेरे पास जावा में निम्नलिखित कोड है;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
अगर हालत लिखने के लिए सबसे अच्छा तरीका क्या है?
मेरे पास जावा में निम्नलिखित कोड है;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
अगर हालत लिखने के लिए सबसे अच्छा तरीका क्या है?
जवाबों:
compareTo(BigDecimal.ZERO)
इसके बजाय का उपयोग करें equals()
:
if (price.compareTo(BigDecimal.ZERO) == 0) // see below
BigDecimal
निरंतर निष्पादन के साथ तुलना BigDecimal.ZERO
करने से new BigDecimal(0)
प्रत्येक निष्पादन का निर्माण होता है ।
FYI करें, BigDecimal
भी स्थिरांक BigDecimal.ONE
और BigDecimal.TEN
आपकी सुविधा के लिए है।
जिस कारण से आप उपयोग नहीं कर सकते हैं BigDecimal#equals()
वह यह है कि यह पैमाने को ध्यान में रखता है :
new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!
इसलिए यह विशुद्ध रूप से संख्यात्मक तुलना के लिए अनुपयुक्त है। हालांकि, BigDecimal.compareTo()
पैमाने पर विचार नहीं करता है जब तुलना:
new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true
वैकल्पिक रूप से, साइनम () का उपयोग किया जा सकता है:
if (price.signum() == 0) {
return true;
}
BigDecimal.ZERO.compareTo(null)
एक निरंतरता है जिसे आप जाँच सकते हैं:
someBigDecimal.compareTo(BigDecimal.ZERO) == 0
equals
और compareTo
के रूप में आपको लगता है नहीं है। docs.oracle.com/javase/1.5.0/docs/api/java/math/…
वैकल्पिक रूप से, मुझे लगता है कि यह ध्यान देने योग्य है कि बिगडेसिमल में क्लास में बराबरी और तुलना के तरीकों का व्यवहार एक-दूसरे के अनुरूप नहीं है ।
मूल रूप से इसका मतलब है कि:
BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO)==0); //true
System.out.println(someValue.equals(BigDecimal.ZERO)); //false
इसलिए, आपको अपने someValue
चर में पैमाने के साथ बहुत सावधान रहना होगा, अन्यथा आपको अप्रत्याशित परिणाम मिलेगा।
आप बराबर का उपयोग करना चाहते हैं () क्योंकि वे ऑब्जेक्ट हैं, और बिल्ट इन जीरो उदाहरण का उपयोग करें:
if(selectPrice.equals(BigDecimal.ZERO))
ध्यान दें कि .equals()
पैमाने को ध्यान में रखा जाता है, इसलिए जब तक selectPrice समान पैमाने (0) नहीं होता है, .ZERO
तब तक यह गलत होगा।
समीकरण से बाहर ले जाने के लिए के रूप में यह थे:
if(selectPrice.compareTo(BigDecimal.ZERO) == 0)
मुझे ध्यान देना चाहिए कि कुछ गणितीय स्थितियों के लिए 0.00 != 0
, जिसके कारण मैं कल्पना करता हूं कि .equals()
यह पैमाना है। 0.00
सौवें स्थान पर सटीकता देता है, जबकि 0
वह सटीक नहीं है। स्थिति पर निर्भर करता है कि आप किसके साथ रहना चाहते हैं .equals()
।
equals
और compareTo
के रूप में आपको लगता है नहीं है। docs.oracle.com/javase/1.5.0/docs/api/java/math/…
equals
पैमाने को ध्यान में रखता है, जो कि हम यहां नहीं चाहते हैं।
equals
जाना चाहिए compareTo()
। ओपी निर्दिष्ट नहीं करता है कि वह किस प्रकार के गणित का उपयोग कर रहा है, इसलिए आप सही हैं कि उसे दोनों विकल्प देना बेहतर है।
ग्रिफ़ीडॉग निश्चित रूप से सही है:
कोड:
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)));
परिणाम:
myBigDecimal=0.000000
BigDecimal.valueOf(0.000000)=0.0
equals=false
compare=true
जब मैं बिगडिमल तुलना के फायदों को समझता हूं, तो मैं इसे सहज निर्माण नहीं मानूंगा (जैसे ==, <,>, <=>,> = ऑपरेटर हैं)। जब आप अपने सिर में एक लाख चीजें (ठीक, सात चीजें) धारण कर रहे हैं, तो कुछ भी आप अपने संज्ञानात्मक भार को कम कर सकते हैं एक अच्छी बात है। इसलिए मैंने कुछ उपयोगी सुविधा कार्यों का निर्माण किया:
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);
}
यहाँ उनका उपयोग करने का तरीका बताया गया है:
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));
परिणाम इस तरह दिखते हैं:
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 का प्रतिनिधित्व करता है :
BigDecimal.ZERO.equals(selectPrice)
आपको इसके बजाय यह करना चाहिए:
selectPrice.equals(BigDecimal.ZERO)
मामले से बचने के लिए जहां selectPrice
है null
।
equals
और compareTo
के रूप में आपको लगता है नहीं है। docs.oracle.com/javase/1.5.0/docs/api/java/math/…