BigDecimal setScale और गोल


140

इस दो कॉल में क्या अंतर है? (क्या वहाँ कोई?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);

6
नीचे दिए गए स्वीकृत उत्तरों के अलावा - setScale () BigDecimal की एक नई वस्तु बनाता है - इसे एक अपरिवर्तनीय वर्ग दिया गया है
prash

9
@prash roundविधि बिगडेक्विमल का एक नया उदाहरण भी देता है क्योंकि, जैसा कि आपने कहा, उदाहरण अपरिवर्तनीय हैं।
डाइसकॉग

जवाबों:


212

एक महत्वपूर्ण बिंदु जिसे सीधे संबोधित किया जाता है, लेकिन "सटीक" और "स्केल" के बीच का अंतर है और दो बयानों में उनका उपयोग कैसे किया जाता है। "परिशुद्धता" एक संख्या में महत्वपूर्ण अंकों की कुल संख्या है। "स्केल" दशमलव बिंदु के दाईं ओर अंकों की संख्या है।

MathContext कंस्ट्रक्टर केवल सटीक और RoundingMode को तर्क के रूप में स्वीकार करता है, और इसलिए पहले कथन में स्केल कभी निर्दिष्ट नहीं होता है।

setScale() स्पष्ट रूप से पैमाने को एक तर्क के रूप में, साथ ही साथ राउंडिंगमॉड स्वीकार करता है, हालांकि दूसरे कथन में सटीकता कभी भी निर्दिष्ट नहीं की जाती है।

यदि आप दशमलव बिंदु को दाईं ओर ले जाते हैं, तो अंतर स्पष्ट हो जाएगा:

// 1.
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
//result = 35.35
// 2.
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
// result = 35.3456

38
पुन: "" सटीक "एक संख्या में अंकों की कुल संख्या है।" सं। परिशुद्धता महत्वपूर्ण अंकों की संख्या है। 0.000042M की सटीकता है 2.
डेविड जे।

2
देखें: "सटीक": डिजिट काउंट सटीक परिणाम के बाएं नॉनजेरो अंक से शुरू होता है। docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
एड़ी

यदि "परिशुद्धता में महत्वपूर्ण अंकों की संख्या है" की तुलना में 0.0000009 की सटीकता 2 के रूप में क्यों आ रही है? यह 1 होना चाहिए
सांची गिरोत्रा

1
आपके BigDecimal का मान कैसे सेट हो रहा है? आप मान कैसे आउटपुट कर रहे हैं (String.format () का उपयोग करके महत्वपूर्ण अंक छिपा सकते हैं)?
डेल पीटर

1
@ सांचीगिरो सटीक "अनसाल्टेड वैल्यू में अंकों की संख्या" है। 90 के बिना बिके हुए मान और 8 के पैमाने के साथ 2 की सटीकता 0.0000009 है। जैसा कि 1 की सटीकता, 9 का
बिना सोचे

52

वास्तव में एक बड़ा अंतर है, जिसे आपको ध्यान में रखना चाहिए। सेटस्केल वास्तव में आपकी संख्या के पैमाने को निर्धारित करता है जबकि राउंड आपके नंबर को निर्दिष्ट अंकों के लिए गोल करता है लेकिन यह "सटीक परिणाम के बाएं अंक से शुरू होता है" जैसा कि जद के भीतर बताया गया है। इसलिए आपके नमूने के संबंध में परिणाम समान हैं, लेकिन इसके बजाय 0.0034 का प्रयास करें। यहाँ मेरे ब्लॉग पर उस बारे में मेरी टिप्पणी है:

http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html

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