जावा में BigDecimal वैरिएबल == 0 कैसे चेक करें?


202

मेरे पास जावा में निम्नलिखित कोड है;

BigDecimal price; // assigned elsewhere

if (price.compareTo(new BigDecimal("0.00")) == 0) {
    return true;
}

अगर हालत लिखने के लिए सबसे अच्छा तरीका क्या है?


12
कई उत्तर BigDecimal's -equals () पद्धति का उपयोग करके सुझाव दे रहे हैं। लेकिन यह विधि पैमाने को ध्यान में रखती है, इसलिए तुलना () का उपयोग करने के बराबर नहीं है।
ग्रिफिएडॉग

जवाबों:


472

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

BigDecimal.ZERO.compareTo (कीमत) == 0
जैककोबेक

97

वैकल्पिक रूप से, साइनम () का उपयोग किया जा सकता है:

if (price.signum() == 0) {
    return true;
}

21
शायद यह तेज़ है, लेकिन तुलना (BigDecimal.ZERO) अधिक पठनीय है।
एलियन बाइट

@ एलियन, आप इसे हमेशा विधि के साथ लपेट सकते हैं, जिसमें अधिक पठनीय नाम है, या यहां तक ​​कि आपके व्यवसाय-तर्क का हिस्सा भी है, इस तरह की तुलना से
जुड़ा हुआ है

3
Unfortuntely signum () null-safe नहीं है, जबकि ComparTo है, जब BigDecimal.ZERO.compareTo () की तरह तुलना की जाती है, तो उस पर ध्यान दें
WeGa

15
@ वेब यह सच नहीं है: BigDecimal.ZERO.compareTo(null)
एसीवी

5
@ACV, आपकी सतर्कता के लिए धन्यवाद। स्रोत कोड को देखा, तुलना () केवल गैर-अशक्त तर्क की अपेक्षा करता है।
वेगा

24

एक निरंतरता है जिसे आप जाँच सकते हैं:

someBigDecimal.compareTo(BigDecimal.ZERO) == 0

3
अनुरोध की गई "योदा स्थिति" की आपकी शब्दावली को चोरी करने की अनुमति।
सिंपलपांडा


के जावा BigDecimal के व्यवहार equalsऔर compareToके रूप में आपको लगता है नहीं है। docs.oracle.com/javase/1.5.0/docs/api/java/math/…
nhahtdh

2
अगर आप एक अशक्त में गुजरते हैं तो बिगडेसिमल की तुलना अभी भी एक अपवाद फेंक देगी।
जॉन जियांग

5

मैं आमतौर पर निम्नलिखित का उपयोग करता हूं:

if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }

5

वैकल्पिक रूप से, मुझे लगता है कि यह ध्यान देने योग्य है कि बिगडेसिमल में क्लास में बराबरी और तुलना के तरीकों का व्यवहार एक-दूसरे के अनुरूप नहीं है

मूल रूप से इसका मतलब है कि:

BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO)==0); //true
System.out.println(someValue.equals(BigDecimal.ZERO)); //false

इसलिए, आपको अपने someValueचर में पैमाने के साथ बहुत सावधान रहना होगा, अन्यथा आपको अप्रत्याशित परिणाम मिलेगा।


5

आप बराबर का उपयोग करना चाहते हैं () क्योंकि वे ऑब्जेक्ट हैं, और बिल्ट इन जीरो उदाहरण का उपयोग करें:

if(selectPrice.equals(BigDecimal.ZERO))

ध्यान दें कि .equals()पैमाने को ध्यान में रखा जाता है, इसलिए जब तक selectPrice समान पैमाने (0) नहीं होता है, .ZEROतब तक यह गलत होगा।

समीकरण से बाहर ले जाने के लिए के रूप में यह थे:

if(selectPrice.compareTo(BigDecimal.ZERO) == 0)

मुझे ध्यान देना चाहिए कि कुछ गणितीय स्थितियों के लिए 0.00 != 0, जिसके कारण मैं कल्पना करता हूं कि .equals()यह पैमाना है। 0.00सौवें स्थान पर सटीकता देता है, जबकि 0वह सटीक नहीं है। स्थिति पर निर्भर करता है कि आप किसके साथ रहना चाहते हैं .equals()


के जावा BigDecimal के व्यवहार equalsऔर compareToके रूप में आपको लगता है नहीं है। docs.oracle.com/javase/1.5.0/docs/api/java/math/…
nhahtdh

डॉक्स से लिंक करने के बजाय आपको बताने का क्या मतलब है? मैंने जो सुझाव दिया वह ओपी के लिए काम करना चाहिए।
नोमिनसिम

एडविन डेलोरजो का जवाब वास्तव में इसे काफी अच्छी तरह से समझाता है। equalsपैमाने को ध्यान में रखता है, जो कि हम यहां नहीं चाहते हैं।
nhahtdh

@nhahtdh जानकारी के लिए धन्यवाद, वास्तव में हालांकि ऐसी स्थितियां हैं जिनके बजाय इसका उपयोग किया equals जाना चाहिए compareTo()। ओपी निर्दिष्ट नहीं करता है कि वह किस प्रकार के गणित का उपयोग कर रहा है, इसलिए आप सही हैं कि उसे दोनों विकल्प देना बेहतर है।
नोमिनसिम

3

ग्रिफ़ीडॉग निश्चित रूप से सही है:

कोड:

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

1
वहाँ कई जवाब है कि वास्तव में समझा रहे हैं। एक और उत्तर जोड़ने की बात क्या है? यदि आपके पास अतिरिक्त जानकारी है, तो नए उत्तर को जोड़ना एक अच्छा विचार है, लेकिन इस पोस्ट में ऐसा नहीं है।
टॉम

मुद्दा लेना। हालांकि, जब मैं कुछ सीख रहा होता हूं, तो मैं यथासंभव कई उदाहरण देखना पसंद करता हूं, भले ही वे समान हों। आपके लिए, टॉम, मैंने अपनी लाइब्रेरी जोड़ी जो मुझे उपयोगी लगी। आपका माइलेज अलग-अलग हो सकता है। :-)
तिहामर

0

बस यहाँ कोटलिन के लिए कुछ उपयोगी एक्सटेंशन साझा करना चाहते हैं

fun BigDecimal.isZero() = compareTo(BigDecimal.ZERO) == 0
fun BigDecimal.isOne() = compareTo(BigDecimal.ONE) == 0
fun BigDecimal.isTen() = compareTo(BigDecimal.TEN) == 0

-2
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));

1
इस कोड को इस सवाल का जवाब कर सकते हैं, अतिरिक्त प्रदान संदर्भ के बारे में कैसे और / या क्यों यह हल करती है समस्या जवाब की दीर्घकालिक मूल्य में सुधार होगा। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है! कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, और इस बात का संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं। यह भी उल्लेख करने के लिए चोट नहीं करता है कि यह उत्तर दूसरों की तुलना में अधिक उपयुक्त क्यों है।
देव-आईएल

-8

एक स्थिर स्थिरांक है जो 0 का प्रतिनिधित्व करता है :

BigDecimal.ZERO.equals(selectPrice)

आपको इसके बजाय यह करना चाहिए:

selectPrice.equals(BigDecimal.ZERO)

मामले से बचने के लिए जहां selectPriceहै null


3
के जावा BigDecimal के व्यवहार equalsऔर compareToके रूप में आपको लगता है नहीं है। docs.oracle.com/javase/1.5.0/docs/api/java/math/…
nhahtdh

तो दूसरी पंक्ति के लिए ... यदि चयनितपर्वा शून्य है तो यह सिर्फ NullPointerException को फेंक देगा।
user3206236
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.