2010-07-29 326 views
7

जैसा ऊपर बताया गया है। (: 3, पैमाने: 2 परिशुद्धता) जावा में 0.xxxx से xxxx को बदलने के लिए

  • 0,345 (परिशुद्धता: 4, पैमाने: 3 मैं एक उदाहरण देता हूँ, मान लें कि सभी परीक्षण मान 1 से भी कम समय है, लेकिन एक से अधिक 0.

    • 0,12 हैं)
    • 0,6789 (परिशुद्धता: 5, पैमाने: 4)

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

    • 0,12 -> 12
    • 0.345 -> 345
    • .6789 -> 6789

    0,1 और 0.01 और 0.001 के लिए 1 मिलना चाहिए (मैं इस मैं बुरा विचार जानते हैं, लेकिन मैं कर दिया गया है सॉफ़्टवेयर के व्यावसायिक नियमों के सेट)

    मैं जावा में समाधान पसंद करता हूं लेकिन यदि गणित एल्गोरिदम है तो यह बेहतर है। धन्यवाद।

  • +2

    आप कैसे विभाजित भाग निकालना चाहते हैं? एक पूर्णांक के रूप में? उस स्थिति में, 0.0042 जैसे मूल्यों के साथ क्या होना चाहिए? – snemarch

    +0

    क्या ये बिगडेसिमल या युगल हैं? डबल्स में सटीक समस्याएं होंगी। –

    उत्तर

    11

    समाधान यहां प्रस्तुत किया गया कोई भी आसान है। आपको BigDecimal का उपयोग करना चाहिए:

    BigDecimal a = new BigDecimal("0.0000012"); 
    BigDecimal b = a.movePointRight(a.scale()); 
    
    +0

    +1 साफ़ करने के लिए धन्यवाद। – NullUserException

    +0

    सबसे सरलतम कभी। बस पूछना .. कैसे x> 1 उदाहरण: 1.0000012 कोई अन्य तरीका है? – ommar

    +0

    +1 लेकिन मैं वोट नहीं दे सकता (अनियंत्रित)! बिगडिसीमल (स्ट्रिंग) कन्स्ट्रक्टर का उपयोग 0 <= x <1 – eee

    4

    ट्रंक x = x तक 10 तक गुणा करें।

    (अपरीक्षित कोड) की तरह कुछ:

    double val = ... ; // set the value. 
    
    while(Math.floor(val) != val) 
        val *= 10.0; 
    
    +2

    फ्लोटिंग पॉइंट त्रुटि * * सैद्धांतिक रूप से आपको यहां काट सकती है, क्योंकि 10 2 से अधिक नहीं है। – Amber

    +0

    मैं इस बिट के बारे में थोड़ा सा संदेह भी कर रहा हूं: Math.floor (val)! = Val – Cambium

    +0

    अब तक अच्छा विचार है प्रदर्शन के लिए यह 0 के लिए धीमा हो सकता है।12345678987654321 और अधिक .. – ommar

    3

    एक विकल्प बस दशमलव बिंदु पर स्ट्रिंग में बदलने के लिए, विभाजन, और यह करने के बाद भाग हड़पने वापस एक पूर्णांक में होगा:

    Integer.parseInt((Double.toString(input_val).split('\\.'))[1]) 
    

    (नोट: आप प्रक्रिया के हिस्से के रूप में कुछ त्रुटि जांचना चाह सकते हैं; उपरोक्त उदाहरण कोड एक संवेदी संस्करण है जो अभी बिंदु को व्यक्त करने के लिए डिज़ाइन किया गया है।)

    +0

    विशेष रूप से अच्छा समाधान नहीं है - 1.1 बनाम 1.001 :) – snemarch

    +0

    पर विचार करें इसके बारे में क्या? ओपी ने यह निर्दिष्ट नहीं किया कि प्रमुख शून्यों के साथ क्या किया जाना चाहिए, यदि वे मौजूद हैं, और ऐसा नहीं है कि कोई अन्य समाधान उन्हें बेहतर तरीके से संभाल सकता है ... – Amber

    +0

    प्रश्न अपडेट किया गया। मैं इसके अजीब जानता हूं लेकिन इसकी प्रलेखन – ommar

    0

    एम्बर के विचार में सुधार:

    //for 0 <= x < 1 
    Integer.parseInt((Double.toString(x).replaceFirst("0.", "")); 
    

    यह 1. नीचे किसी भी कीमत किसी भी मान 1 से अच्छी तरह से काम करता है और इसके बाद के संस्करण java.lang.NumberFormatException

    संपादित ट्रिगर किया जाएगा: किसी ने मुझे फर्क बता सकते हैं डेटा है अगर नीचे की तरह?

    0.0012 -> 12 
    0.12 -> 12 
    
    +0

    @NullUserException, मुझे नहीं पता कि उसके कोड और आपके उदाहरण (शुरुआत में अतिरिक्त कोष्ठक के अलावा) में क्या समस्या होगी। एक्स + 0.0000001 के साथ Double.toString (x) "0.0000001" लौटाएगा और फिर प्रतिस्थापन फर्स्ट "0000001" वापस लौटाएगा जिसे सही करने के लिए पार्स किया जा सकता है? –

    +0

    x = 0.0000001 के साथ ऐसा करने का प्रयास करें; x = 0.001 के साथ भी टूट जाता है (1 के बजाय 10 उत्पन्न करता है) – NullUserException

    +0

    @ किरणू नेगेटरी। 'Double.toString'' 0.0001' से '1.0E-4' रूपांतरित करेगा, इस प्रकार कोड को तोड़ देगा। – NullUserException

    0

    क्या आप ऐसा कुछ करने की कोशिश कर रहे हैं?

    public static void main(String[] args) { 
        double d = 0.1234; 
        while(d>(long)d){ 
         d*=10; 
        } 
        System.out.println((long)d); 
    } 
    
    संबंधित मुद्दे