2012-07-15 12 views
10

कहो की दशमलव अंक निकालने के लिए हम 12345.6789 की दोहरी मूल्य (गतिशील होना चाहिए)कैसे डबल/BigDecimal

अब आवश्यकता संख्या विभाजित है और दशमलव अंक और दशमलव अंक प्राप्त कर रहा है, जो होगा:

double number = 12345.6789; 
int decimal = 12345; 
int fractional = 6789; 

मुझे दशमलव भाग का काम मिल गया है, लेकिन क्या आप कृपया आंशिक भाग पर एक संकेत दे सकते हैं? बहुत बहुत धन्यवाद।

+1

आप * मुद्रित * प्रतिनिधित्व का आंशिक भाग के लिए देख रहे हैं आपको तय करना होगा, या यदि आप वास्तविक द्विआधारी प्रतिनिधित्व में सटीकता में प्रतीयमान असमानता को स्वीकार करने को तैयार हैं। – seh

+0

@seh एक अंतर है कि fractional केवल पंचर के बिना अंक होना चाहिए। – Dreamer

+0

एकमात्र तरीका यह है कि दशमलव के साथ काम करने के लिए संख्या निर्धारित करें ... 2 दशमलव के साथ उदाहरण: 0.01 1 होगा, और 0.10 होगा 10. मेरा जवाब देखें। – marcolopes

उत्तर

13
double number = 12345.6789; // you have this 
int decimal = (int) number; // you have 12345 
double fractional = number - decimal // you have 0.6789 

समस्या है कि यहाँ आंशिक हिस्सा ".6789" के रूप में स्मृति में नहीं लिखा है, लेकिन कुछ "ऑफसेट" हो सकता है, तो कहने के लिए है। उदाहरण के लिए 0.67890.67889999291293929991 के रूप में संग्रहीत किया जा सकता है।

मैं अपने मुख्य यहां चिंता आंशिक हिस्सा हो रही नहीं जाता है, लेकिन एक निश्चित परिशुद्धता साथ आंशिक हिस्सा हो रही है। लेकिन

String doubleAsText = "12345.6789"; 
double number = Double.parseDouble(doubleAsText); 
int decimal = Integer.parseInt(doubleAsText.split("\.")[0]); 
int fractional = Integer.parseInt(doubleAsText.split("\.")[1]); 

, जैसा कि मैंने कहा, यह है:

आप सटीक मान आप को सौंपा प्राप्त करना चाहते हैं, तो आप इस पर विचार करना (हालांकि, यह एक स्वच्छ समाधान नहीं है) चाहते हो सकता है सबसे कुशल और स्वच्छ समाधान नहीं है।

+0

इसे विभाजित विधि के लिए एक रेगेक्स स्ट्रिंग तर्क की आवश्यकता है। तो आपको "\\।" का उपयोग करने की आवश्यकता है रेफरी: http://stackoverflow.com/a/14833048/2000405 –

5

आप जो भी करना चाहते हैं वह ठीक नहीं कर सकते हैं।

एक समस्या यह है कि यदि आपके पास 1.05 है तो परिणाम क्या होना चाहिए?

double number = 1.05; 
int decimal = 1; 
int fractional = 5; // Oops! "1.05" and "1.5" give the same result. 

इस बारे में कैसे?

int fractional = 05; // Still not correct. This is an octal number. 

एक और समस्या यह है कि डबल प्रकार बिल्कुल 12345.6789 का प्रतिनिधित्व नहीं कर सकते हैं। यह इसके बजाय थोड़ा अलग नंबर स्टोर करता है। इसे प्रतिनिधित्व त्रुटि कहा जाता है। तो आंशिक भाग वास्तव में 6789 नहीं होगा। इसके बजाय आप इसे कुछ दशमलव स्थानों पर बंद कर सकते हैं।

int fractional = (int)Math.round((number - decimal) * 1000); 
+0

वास्तव में हर समय काम नहीं करेगा क्योंकि आंशिक भाग में 4 अंक अधिक हो सकते हैं :) – GETah

+0

@ मार्क बॉयर्स समाधान के लिए धन्यवाद, लेकिन अंश भाग के बारे में क्या गतिशील है इसलिए हम नहीं जानते कि यह कितना समय है * 1000 समाधान काम नहीं कर रहा है। यदि डबल 12345.678 है तो यह * 100 हो जाता है। – Dreamer

+2

@ सुबारूल: मैंने आपको समाधान नहीं दिया, मैंने आपको एक स्पष्टीकरण दिया कि यह आवश्यकताओं को बदलने के बिना क्यों नहीं किया जा सकता है। आप किस आवश्यकता को बदलने के इच्छुक हैं? –

2

आप String में बदल सकते हैं, दशमलव बिंदु मिल जाए, स्ट्रिंग और फिर पूर्णांक को वापस परिवर्तित।

String numberStr = Double.toString(number); 
String fractionalStr = numberStr.substring(numberStr.indexOf('.')+1); 
int fractional = Integer.valueOf(fractionalStr); 
2

आपको यह तय करना होगा कि कितने दशमलव का समर्थन करना है। मैं इस विधि का उपयोग:

int decimals = 2; 
BigDecimal value = new BigDecimal(123.45).setScale(decimals, RoundingMode.HALF_EVEN); 
BigInteger INTEGER = value.abs().toBigInteger(); 
//(value - INTEGER) * (10^decimais) 
BigInteger DECIMAL = ((value.subtract(new BigDecimal(INTEGER))).multiply(new BigDecimal(10).pow(decimals))).toBigInteger();