2012-06-24 9 views
7

मैं 2 अंकों के अंक में बदल दो मुद्रा मानों की तुलना करने BigDecimal का उपयोग कर की सोच रहा हूँ में BigDecimal। उदाहरण के लिए मैं निम्नलिखित 0 को उपज करने की अपेक्षा करता हूं क्योंकि मैं कुछ ऐसा तुलना कर रहा हूं जो 0.02 के साथ 0.02 के साथ होना चाहिए। लेकिन यह -1 पैदा करता है !! क्या ऐसा करने का कोई सही तरीका है?जावा

यह भी 123.45 बनाम 123.4534 की तरह बड़ी संख्या के लिए काम करना चाहिए ... जो 0 उपज चाहिए जब "compareTo" प्रयोग किया जाता है।

मैं गणित संदर्भ का उपयोग कर की कोशिश की है, लेकिन यह सुंदर लग रहे हैं नहीं करता है ... वहाँ एक सही तरीका है?

BigDecimal spread = new BigDecimal(0.01934); 
spread.setScale(2, RoundingMode.HALF_EVEN); 
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(new BigDecimal(0.02))); 

और समाधान है:

BigDecimal spread = new BigDecimal(0.01934).setScale(2, RoundingMode.HALF_EVEN); 
BigDecimal loSpread = new BigDecimal(0.02).setScale(2, RoundingMode.HALF_EVEN); 
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(loSpread)); 

उत्तर

5

0,02 setScale (2, RoundingMode.HALF_EVEN) को

java.math.BigDecimal = 0.0200000000000000004163336342344337026588618755340576171875 

आपके पास करने के लिए मूल्यांकन किया जाता हो जाता है वहाँ: तो एक स्ट्रिंग का प्रयास करें।

+0

सटीक फ़्लोटिंग पॉइंट नंबर प्राप्त करने का यह एक और तरीका है। 1 +। –

+0

इसे सही करने के लिए यहां दोनों विचारों का उपयोग करना था। सही कोड पोस्ट करेंगे। – fodon

10

पहले, BigDecimal अपरिवर्तनीय है। आप अपने setScale विधि कॉल से परिणाम लौटाएगा:

spread = spread.setScale(2, RoundingMode.HALF_EVEN); 

इसके बाद आप के बाद से यह एक डबल से प्राप्त की जा रही है दूसरी BigDecimal के अपने सटीकता में सुधार करना होगा - एक बहुत सटीक नहीं इकाई। भी

spread.compareTo(new BigDecimal("0.02")) 
+0

यह वास्तव में कीमतों की तुलना करने के लिए उपयोग किया जाता है। उन्हें युगल से तत्काल होना पड़ सकता है। – fodon

+0

@fodon: तब उपयोगकर्ता अज्ञात आपके लिए आपके उत्तर का हिस्सा है, और मेरे पास दूसरा हिस्सा है (BigDecimal अपरिवर्तनीय होने के संबंध में)। –

+1

मैंने अमान्य संपादन को वापस कर दिया। दोस्तों, कृपया _comment_ या _additional answer_ प्रदान करें यदि आप जो उत्तर देखते हैं उससे संतुष्ट नहीं हैं। –