तुलना करें अगर BigDecimal शून्य से अधिक है


245

यदि BigDecimalमूल्य शून्य से अधिक है तो मैं कैसे तुलना कर सकता हूं ?


1
में नज़र github.com/mortezaadi/bigdecimal-utils एक विधि isPositive () वहाँ भी कर रहे हैं वहाँ की तरह है (BigDecimal) .isZero (); (BigDecimal) .notZero () है; (BigDecimal) .isPositive () है; // शून्य से अधिक है (बिगडेसिमल) .isNegative (); // शून्य से कम है (bigdecimal) .isNonPositive (); // इससे कम या बराबर शून्य है (बिगडेसिमल) .isNonNegative ();
मोर्टेजा आदि

@MortezaAdi तुलनात्मक कार्यों को BigDecimalलागू करने Comparableके बाद से lt, le, eq, neबेहतर करने के लिए स्थानांतरित कर दिया ComparableUtils। इसलिए उनका उपयोग किसी अन्य वर्ग जैसे Dateया कस्टम प्रकार के लिए किया जा सकता है ।
djmj

@djmj आवश्यकताएँ कार्यान्वयन को परिभाषित करती हैं, तुलनात्मक उपयोग करने के लिए न तो कोई आवश्यकता थी और न ही इरादा था। लेफ्टिनेंट, ले, ईक, आदि की कार्यक्षमता के अलावा जेनेरिक की तुलना में पूरी तरह से अलग हैं।
मोर्टेजा आदि

जवाबों:


401

यह उतना ही सरल है:

if (value.compareTo(BigDecimal.ZERO) > 0)

के लिए दस्तावेज़compareTo वास्तव में निर्दिष्ट है कि यह वापस आ जाएगी -1, 0 या 1, लेकिन अधिक सामान्य Comparable<T>.compareTo, विधि केवल गारंटी देता है शून्य से कम शून्य, या उचित तीन मामलों के लिए शून्य से अधिक - तो मैं आम तौर पर सिर्फ इतना है कि तुलना करने के लिए चिपके रहते हैं।


50
चेतावनी के लिए एक अतिरिक्त शब्द कहा जाता है। मान लीजिए कि valueशून्य का मान है, लेकिन एक गैर-शून्य पैमाने (जैसे कि 0.00इसके बजाय इसका मूल्यांकन करता है 0)। आप शायद विचार करना चाहते हैं कि यह शून्य के बराबर है। compareTo()विधि वास्तव में ऐसा करेंगे। लेकिन equals()विधि नहीं होगी। (एक और सबूत, अगर किसी की जरूरत थी, कि लोकी या उसका एक अवतार जीवित और अच्छी तरह से है और सॉफ्टवेयर विकास में बदल गया है।)
एंड्रयू स्पेंसर

9
जबकि मैं मानता हूं कि यह जावा में मुहावरेदार समाधान है, मुझे नहीं लगता कि यह वास्तव में पठनीय है। जब भी मैं इस तरह से एक अभिव्यक्ति का सामना करता हूं, तो मैं खुद को आश्वस्त करने के लिए एक परीक्षण लिखता हूं कि मुझे यह सही तरीके से मिला है। शायद तथ्य यह है कि हाल ही में जोड़े गए वर्गों, जैसे LocalDateशामिल isBeforeहै एक संकेत है कि ओरेकल उसी तरह महसूस करता है। यह आदर्श नहीं है, लेकिन मुझे लगता है कि इन परिस्थितियों में उपयोगिता isGreaterThanविधि लिखने के लिए यह थोड़ा अधिक पठनीय है ।
मार्क स्लेटर

क्या @Jon Skeet समाधान भी काम करता है यदि मान 0.00 या 0.0 है
एंजेलीना

1
@Angelina: मुझे इसकी उम्मीद है, निश्चित रूप से - वे मान 0 से अधिक नहीं हैं , इसलिए मैं compareToवापस लौटने की उम्मीद करूंगा । लेकिन अगर आप चिंतित हैं, तो आपके लिए परीक्षण करना आसान होना चाहिए।
जॉन स्कीट

@MarkSlater मैं सहमत हूं, तुलना केवल जावा को पठनीयता में सुधार करने के लिए अधिक समय का निवेश करना चाहिए और इसका कोई मतलब नहीं है अगर हर किसी को हर परियोजना में अपने स्वयं के पठनीय तरीके बनाने हैं। C # में आप मौजूदा कक्षाओं के लिए एक्सटेंशन विधियाँ भी बना सकते हैं ताकि आप सीधे `value.isGitoryThen (foo)` `का उपयोग कर सकें
djmj

165

12
BigDecimal.compareTo () संकेतों को अनुकूलन के रूप में तुलना करके शुरू होता है। तो यह तुलनात्मक रूप से कॉल करना सबसे अच्छा है (), क्योंकि यह अधिक इरादा-खुलासा है और केवल एक अतिरिक्त विधि कॉल की कीमत है (जो मुझे संदेह है कि वैसे भी इनलेट हो जाएगा)।
एंड्रयू स्पेंसर

27
यह सार्वजनिक एपीआई का हिस्सा है। तो यह मेरे लिए, एक बेहतर तरीका है। इरादा यह निर्धारित करने के लिए है कि संकेत सकारात्मक है (यानी> शून्य)
मार्क

क्या आपको लगता है कि यह उच्च प्रदर्शन है अगर यह केवल एक Stringइनिशियलाइज़ के पहले चरित्र को पकड़ता है या नहीं BigDecimalयह देखने के लिए -? यह मेरा सबसे अच्छा अनुमान है कि यह कैसे काम कर सकता है। यदि वास्तव में संख्या का निर्धारण करने के लिए तेजी से लगता है 0। क्या ये सही है? अग्रिम में बहुत बहुत धन्यवाद एंटोन बेस्सोनोव!

5
यदि आप विघटित BigDecimal.compareTo()विधि को देखते हैं, तो आप पाएंगे कि यह signum()दो बार कॉल करता है । इसलिए जहां तक ​​प्रदर्शन जाता है, signum()बेहतर है।
मीर

1
दशमलव के मामलों में आपकी क्या समस्या थी? @jfajunior
İsmail Yavuz

11

compareTo()फ़ंक्शन का उपयोग करें जो कक्षा में बनाया गया है।


1

यह विधि का उपयोग करने के लिए सुरक्षित है compareTo()

    BigDecimal a = new BigDecimal(10);
    BigDecimal b = BigDecimal.ZERO;

    System.out.println(" result ==> " + a.compareTo(b));

कंसोल प्रिंट

    result ==> 1

compareTo() रिटर्न

  • 1 यदि a, b से अधिक है
  • -1 यदि b, b से कम है
  • 0 यदि बी के बराबर है

अब आपकी समस्या के लिए आप इसका उपयोग कर सकते हैं

if (value.compareTo(BigDecimal.ZERO) > 0)

या

if (value.compareTo(new BigDecimal(0)) > 0)

मुझे उम्मीद है कि इसने आपकी मदद की।


0

BigDecimal ऑब्जेक्ट पर ".intValue ()" का उपयोग करना सही नहीं है जब आप जांचना चाहते हैं कि इसका ग्रेटर शून्य से अधिक है या नहीं। एकमात्र विकल्प बचा है ".compareTo ()" विधि।


-2
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");

ओब्ज के पास संख्यात्मक स्ट्रिंग है, स्वीकृत उत्तर में मान घोषित नहीं किया गया है, भ्रामक हो सकता है। मेरे उत्तर में अधिक स्पष्टता होगी।
राम कृष्ण
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.