एन दशमलव स्थानों के लिए फ़्लोट को फ़ॉर्मेट करें


220

मुझे "n" दशमलव स्थानों पर एक फ्लोट प्रारूपित करने की आवश्यकता है।

BigDecimal के लिए कोशिश कर रहा था, लेकिन वापसी मूल्य सही नहीं है ...

public static float Redondear(float pNumero, int pCantidadDecimales) {
    // the function is call with the values Redondear(625.3f, 2)
    BigDecimal value = new BigDecimal(pNumero);
    value = value.setScale(pCantidadDecimales, RoundingMode.HALF_EVEN); // here the value is correct (625.30)
    return value.floatValue(); // but here the values is 625.3
}

मुझे मेरे द्वारा निर्दिष्ट दशमलव स्थानों की संख्या के साथ एक फ्लोट मान वापस करने की आवश्यकता है।

मुझे Floatवैल्यू रिटर्न की जरूरत हैDouble

जवाबों:


561

आप फ़्लोट मान भी पास कर सकते हैं, और उपयोग कर सकते हैं:

String.format("%.2f", floatValue);

प्रलेखन


70
कृपया सावधान रहें क्योंकि String.format आपके वर्तमान स्थानीय कॉन्फ़िगरेशन पर निर्भर करता है, आपको एक विभाजक के रूप में एक डॉट नहीं मिल सकता है। का उपयोग करना पसंद करते हैंString.format(java.util.Locale.US,"%.2f", floatValue);
गोमिनो

6
यह जवाब एक स्ट्रिंग मूल्य देता है, फ्लोट मूल्य नहीं, मुझे नहीं लगता कि एक अच्छा जवाब।
झोआगंग

3
आप एक विभाजक के रूप में एक डॉट को क्यों मजबूर करेंगे?
मार्क बुईकेमा

1
@MarkBuikema मुझे लगता है कि ऐसे मामले हैं जहां यह बिल्कुल आवश्यक होगा, जैसे कि मानकों द्वारा संचालित दस्तावेज़ प्रारूपों को संकलित करना, जैसे। पीडीएफ दस्तावेज़।
तजार्ट

39

DecimalFormat पर एक नज़र डालें । आप आसानी से इसका उपयोग संख्या लेने के लिए कर सकते हैं और इसे दशमलव स्थानों की एक निर्धारित संख्या दे सकते हैं।

संपादित करें : उदाहरण


1
+1। यहां एंड्रॉइड-विशिष्ट प्रलेखन है , जो अनिवार्य रूप से समान होना चाहिए।
Zach L

लेकिन मुझे इसकी जरूरत है कि परिणाम एक फ्लोट संख्या है, न कि एक स्ट्रिंग।
seba123neo

क्या आप कह रहे हैं कि आप फ्लोट को गोल करना चाहते हैं? आम तौर पर एक फ्लोट मामलों का एकमात्र समय प्रदर्शन के लिए होता है।
निक कैंपियन

क्षमा करें, आप सही कह रहे हैं, मैं भ्रमित था, स्क्रीन पर दिखाए जाने पर केवल संख्या को प्रारूपित करें, इससे पहले नहीं, यह मेरा प्रश्न था, बहुत बहुत धन्यवाद, समस्या हल हुई।
seba123neo

ध्यान दें, DecimalFormatकंस्ट्रक्टर का उपयोग हतोत्साहित किया जाता है, सही उपयोग के लिए मेरा जवाब देखें NumberFormat
FBB

17

यह कोशिश करो इससे मुझे बहुत मदद मिली

BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP);

रिजल्ट राउंडफाइनलप्राइस -> 5652.26 होगा


2
यह गोल दिखने वाले लोगों के लिए अधिक उपयोगी है और इसके साथ कुछ और संगणना करते हैं, अन्यथा, आरव का उत्तर शायद सबसे अच्छा है।
जेरार्ड

यह GWT के साथ भी काम करता है। String.format () - नहीं करता है।
एलेक्सवी

15

ध्यान दें, DecimalFormatकंस्ट्रक्टर का उपयोग हतोत्साहित किया जाता है। इस वर्ग के लिए javadoc बताता है:

सामान्य तौर पर, DecimalFormat कंस्ट्रक्टर्स को सीधे कॉल न करें, क्योंकि NumberFormat फैक्ट्री के तरीके DecimalFormat के अलावा अन्य उपवर्गों को वापस कर सकते हैं।

https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html

तो आपको क्या करने की आवश्यकता है (उदाहरण के लिए):

NumberFormat formatter = NumberFormat.getInstance(Locale.US);
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
formatter.setRoundingMode(RoundingMode.HALF_UP); 
Float formatedFloat = new Float(formatter.format(floatValue));

यह काम नहीं कर रहा है जब (उदाहरण के लिए) floatValue = 8.499। यह 8.5 दे रहा है।
शिव कृष्ण छीपा

3
@ शिवकृष्णा छीपा: हाँ, क्योंकि यहाँ हम निर्दिष्ट करते हैं कि हम अल्पविराम के बाद 2 अंक चाहते हैं, और अप राउंडिंग करना है। उस स्थिति में, 8.499 को गोल किया जाता है। यदि आप 8.499 को प्रदर्शित करना चाहते हैं, तो बस 3 को अधिकतम अंश अंकों के रूप में सेट करें।
एफबीबी

6

DecimalFormatनिक द्वारा बताए गए वर्ग का उपयोग करके यहां एक त्वरित नमूना है ।

float f = 12.345f;
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(f));

प्रिंट स्टेटमेंट का आउटपुट 12.35 होगा। ध्यान दें कि यह आपके लिए इसे गोल कर देगा।


ध्यान दें, DecimalFormatकंस्ट्रक्टर का उपयोग हतोत्साहित किया जाता है, सही उपयोग के लिए मेरा जवाब देखें NumberFormat
FBB

5

किंडा ने किसी को भी ऐसा करने का सीधा तरीका नहीं बताया, जो काफी आसान है।

double roundToDecimalPlaces(double value, int decimalPlaces)
{
      double shift = Math.pow(10,decimalPlaces);
      return Math.round(value*shift)/shift;
}

बहुत यकीन है कि यह हालांकि आधा-गोल भी नहीं करता है।

इसके लायक होने के लिए, जब भी आप आधार -10 अंकगणित के साथ बाइनरी-आधारित फ़्लोटिंग-पॉइंट मानों को मिलाते हैं, तो आधी-अधूरी गोलाई अव्यवस्थित और अप्रत्याशित होने वाली है। मुझे पूरा यकीन है कि यह नहीं किया जा सकता है। मूल समस्या यह है कि 1.105 जैसे मूल्य को फ्लोटिंग पॉइंट में बिल्कुल दर्शाया नहीं जा सकता है। फ्लोटिंग पॉइंट वैल्यू 1.105000000000001, या 1.104999999999999 जैसी होने जा रही है। तो आधे-अधूरे राउंडिंग करने का कोई भी प्रयास रिप्रेजेंटेटिव एन्कोडिंग एरर्स पर ट्रिप हो रहा है।

IEEE फ़्लोटिंग पॉइंट कार्यान्वयन आधा-राउंडिंग करेंगे, लेकिन वे बाइनरी हाफ़-राउंडिंग करते हैं, दशमलव हाफ़-राउंडिंग नहीं। तो आप शायद ठीक हैं


मैंने भी कुछ समय के लिए इस विधि का उपयोग किया है, लेकिन मुझे लगता है कि powगोलाई के लिए उपयोग करना बहुत महंगा ऑपरेशन है?
ज़ेरुस

कभी भी अनुकूलन न करें जब तक कि आपके पास वास्तव में प्रदर्शन की समस्या न हो। उपवास की तुलना में सही होना अधिक महत्वपूर्ण है। और मैं ईमानदारी से एक ऐसे अनुप्रयोग की कल्पना नहीं कर सकता जहाँ नियंत्रित गोलाई का प्रदर्शन एक मुद्दा होगा, जब तक कि आप वीज़ा या मास्टरकार्ड नहीं थे (जो सिर्फ इस पर अधिक मशीनें फेंकेंगे)। और पाव () शायद गोल () से तेज है।
रॉबिन डेविस


2

यह बहुत कम पेशेवर और बहुत अधिक महंगा तरीका है, लेकिन इसे समझना आसान होना चाहिए और शुरुआती लोगों के लिए अधिक उपयोगी होना चाहिए।

public static float roundFloat(float F, int roundTo){

    String num = "#########.";

    for (int count = 0; count < roundTo; count++){
        num += "0";
    }

    DecimalFormat df = new DecimalFormat(num);

    df.setRoundingMode(RoundingMode.HALF_UP);

    String S = df.format(F);
    F = Float.parseFloat(S);

    return F;
}

1

मुझे लगता है कि आप ist क्या चाहते हैं

return value.toString();

और प्रदर्शन के लिए वापसी मूल्य का उपयोग करें।

value.floatValue();

हमेशा 625.3 लौटाएगा क्योंकि इसका मुख्य रूप से कुछ गणना करना था।


लेकिन मुझे इसकी जरूरत है कि परिणाम एक फ्लोट संख्या है, न कि एक स्ट्रिंग।
18 सितंबर को seba123neo

2
यदि आपको उपयोगकर्ता को दिखाने के लिए फ्लोट की आवश्यकता है, तो एप्लिकेशन के डिज़ाइन में कुछ गड़बड़ हो सकती है। आमतौर पर फ्लोट की गणना करने के लिए उपयोग किया जाता है और इसे उपयोगकर्ता को दिखाने के लिए एक स्ट्रिंग का उपयोग किया जाता है।
n3utrino 8

क्षमा करें, आप सही कह रहे हैं, मैं उलझन में था, स्क्रीन पर दिखाए जाने पर केवल संख्या को प्रारूपित करें, इससे पहले नहीं, यह मेरा प्रश्न था, बहुत बहुत धन्यवाद, समस्या हल हुई।
seba123neo

1

मैं इस प्रश्न का उत्तर ढूंढ रहा था और बाद में मैंने एक विधि विकसित की! :) एक उचित चेतावनी, यह मूल्य को गोल कर रहा है।

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.