2016-04-13 9 views
6

मैं नीचे दिए गए कोडका उपयोग कर स्ट्रिंग के लिए दो बार जावा मानकों

double cellValue = 78871234510124568.0; 

    String cell = new BigDecimal(cellValue).toPlainString(); 
    String b = String.format("%.0f", cellValue); 

    System.out.println("Double Value using Big Decimal " + cell); 
    System.out.println("Double Value using String format " + b); 

डबल मूल्य जो मैं सेट आउटपुट के रूप में वापस नहीं किया है।

डबल मूल्य का उपयोग कर बिग दशमलव 78871234510124576
डबल मूल्य का उपयोग कर स्ट्रिंग प्रारूप 78871234510124576

वहाँ एक मानक तरीका मूल्य long डेटा जा रहा है की सीमा के साथ स्पष्ट प्रकार कास्टिंग के बिना एक String करने के लिए एक Double कन्वर्ट करने के लिए है double के बजाय टाइप (अधिकतम मूल्य)?

इस सवाल पूछने का मेरा इरादा है क्योंकि सभी प्रकार की कोशिका Excel में सामान्य होने के साथ Apache POI का उपयोग कर एक एक्सेल शीट पढ़ रहा हूँ है। मैं getNumericCellValue() उपयोग कर रहा हूँ एक सेल जो हमेशा दशमलव प्रारूप में नंबर प्रदान की मूल्य को पढ़ने के लिए। उदाहरण के लिए 222 22.0 के रूप में वापस कर दिया जाएगा। मैं दशमलव को हटाना चाहता हूं और इसे स्ट्रिंग में बदलना चाहता हूं।

+3

बस सोच रहा है: क्या पैटर्न "% f" वास्तव में स्ट्रिंग पर इनपुट के रूप में काम करता है? एक स्ट्रिंग में नंबर बदलकर इरादा क्या है; फिर उस स्ट्रिंग को संख्या के रूप में प्रारूपित करने के लिए? – GhostCat

+4

जावा के लिए, '78871234510124568.0' और '78871234510124576' समान संख्या हैं, क्योंकि एक डबल इतनी बड़ी मात्रा में स्टोर करने के लिए पर्याप्त नहीं है, इसलिए – Ferrybig

+0

मेरा प्रश्न यह पूछने का इरादा है क्योंकि अपाचे पीओआई का उपयोग करके एक्सेल शीट पढ़ रहा हूं ... सेल के मूल्य को पढ़ने के लिए getNumericCellValue() का उपयोग करके Excel सेल में सभी सेल प्रकार सामान्य हैं .. जो हमेशा दशमलव प्रारूप में संख्या देता है उदाहरण 222 को 22.0 के रूप में वापस कर दिया जाएगा ... मैं दशमलव को हटाने और कनवर्ट करना चाहता हूं यह एक स्ट्रिंग – user2918673

उत्तर

1

परिशुद्धता (महत्वपूर्ण दशमलव स्थान) के कई बिट्स के साथ आप संभालने की कोशिश कर रहे हैं, आपको Double का उपयोग करने से बचने की आवश्यकता है।

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

यदि हां, तो आपको पीओआई से एक स्ट्रिंग प्रस्तुति प्राप्त करने की आवश्यकता होगी और इसे सीधे उपयोग करें, या संख्यात्मक मान प्राप्त करने के लिए स्ट्रिंग मान को BigDecimal पर फ़ीड करें।

यदि आप स्ट्रिंग के रूप में उच्च परिशुद्धता मान वापस करने के लिए पीओआई की व्यवस्था नहीं कर सकते हैं, तो आप पीओआई का सफलतापूर्वक उपयोग नहीं कर सकते हैं, क्योंकि यह आंतरिक रूप से double का उपयोग करके संख्यात्मक मानों का प्रतिनिधित्व कर रहा है। टस, डेटा फ़ाइल पढ़ने के दौरान प्रासंगिक जानकारी पहले ही खो चुकी है।

0

आप निम्न का उपयोग कर सकते हैं:

DecimalFormat amountFormatter = new DecimalFormat("############"); 
String s = amountFormatter.format(amount.doubleValue()); 
+0

आउट आउट 78871234510124576.00 होगा लेकिन मैं इसे 78871234510124568 होना चाहता हूं क्योंकि ऐसा इतना बड़ा मूल्य डबल द्वारा समर्थित नहीं होगा ?? – user2918673

+0

मैंने संपादित किया है, कृपया जांचें। – KayV

+0

नहीं # करण वर्मा – user2918673

2

जब आप एक double को बड़ी संख्या में परिवर्तित आपको कुछ जानकारी खो देंगे। यदि आप या तो

  • त्रुटि के बारे में धारणाएं बनाते हैं तो आप केवल उस जानकारी को वापस रख सकते हैं। जैसे 2 दशमलव स्थानों के लिए गोल।
  • आप जानते हैं कि त्रुटि है।

युगल के साथ ऐसा किया जाने वाला एक तरीका दो युगल होना है। एक मुख्य मूल्य और त्रुटि के साथ एक।

long l = 78871234510124568L; 
double cellValue = l; 
double err = l - (long) cellValue; 

long original = (long) cellValue + (long) err; 

System.out.println("cellValue="+cellValue+" err="+err+" original="+original); 

प्रिंट

cellValue=7.8871234510124576E16 err=-8.0 original=78871234510124568 
4

अनिवार्य रूप से, आपकी समस्या का मूल कारण है, जब आप POI से double मिलती है:

Cell myCell = ... ; 
double cellValue = myCell.getNumericCellValue(); 

वहाँ, cellValue पहले से ही के लिए एक ही आंतरिक प्रतिनिधित्व होता है दोनों 78871234510124568.0 और 78871234510124576.0 (और कम से कम सभी नंबरों inbetween):

System.err.println(Double.doubleToRawLongBits(78871234510124568.0)); 
System.err.println(Double.doubleToRawLongBits(78871234510124576.0)); 

आउटपुट:

4859809850462277474 
4859809850462277474 

यह केवल कैसे चल बिन्दु मान स्मृति में जमा हो जाती है की बात है। इन संख्याओं के बीच अंतर करने के लिए पर्याप्त बिट्स उपलब्ध नहीं हैं। What Every Computer Scientist Should Know About Floating-Point Arithmetic और अधिक जानकारी के लिए IEEE floating point देखें।

आप एक उच्च सटीकता की जरूरत है, तो आप एक String के रूप में मान प्राप्त करना होगा और फिर एक BigDecimal में आगे की प्रक्रिया के लिए String उपयोग करें, यह पार्स करने की तरह:

Cell myCell = ... ; 
String cellValue = myCell.getStringCellValue(); 
DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(Locale.US); 
df.setParseBigDecimal(true); 
BigDecimal value = (BigDecimal) df.parse(cellValue); 

आप उचित स्थान पर विचार करने की जरूरत है, ताकि दशमलव बिंदु सही ढंग से इलाज किया जा सके (. बनाम ,)। Locale.US. का उपयोग करता है।

संबंधित मुद्दे