मैं जावा में केवल दो दशमलव स्थानों पर एक डबल कैसे काट सकता हूं?


93

उदाहरण के लिए मेरे पास वेरिएबल 3.545555555 है, जिसे मैं सिर्फ 3.54 में बदलना चाहूंगा।


18
यह डुप्लिकेट नहीं है। ट्रंकटिंग और राउंडिंग दो पूरी तरह से अलग चीजें हैं।
14 मई को मार्क

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

जवाबों:


144

यदि आप चाहते हैं कि प्रदर्शन उद्देश्यों के लिए, उपयोग करें java.text.DecimalFormat:

 new DecimalFormat("#.##").format(dblVar);

यदि आपको गणना के लिए इसकी आवश्यकता है, तो उपयोग करें java.lang.Math:

 Math.floor(value * 100) / 100;

50
यह एक छोटा 3.545555555 से 3.54 तक प्रदर्शित नहीं होगा , लेकिन 3.55 तक गोल होगा। DecimalFormat.setRoundingMode () को RoundingMode.FLOOR पर सेट करने की आवश्यकता है;
क्रिस्चियन गार्सिया

9
यह मेरे लिए काम नहीं करता है। Mathlo.floor (9.62 * 100) / 100 9.61 देता है
मणि

4
floorट्रंकेट का उपयोग केवल सकारात्मक मूल्यों के लिए काम करता है।
देव

3
@ ChristianGarcía ट्रंकेशन RoundingMode.DOWNको RoudingMode.FLOORहमेशा नकारात्मक अनंत की ओर चक्कर लगाने के साथ ठीक किया जाता है।
देव

46
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);

उपलब्ध जाँच करें RoundingModeऔर DecimalFormat


उस प्रश्न को संबोधित नहीं करता है, जिसने गोलाई के बजाय छंटनी के लिए कहा था।
बेसिल बॉर्क

8
@BasilBourque RoundingMode.DOWN ट्रंकेशन है। अन्य कार्यों के साथ तुलना करें जो गलत तरीके से फर्श कार्यों की सिफारिश करते हैं (फर्श केवल सकारात्मक संख्याओं को काटता है), यह सकारात्मक और नकारात्मक दोनों मानों के लिए सही ढंग से काम करता है।
देव

1
@ क्या मैं सही हूं। मैं अब देखता हूं कि DOWNवास्तव में सकारात्मक और नकारात्मक दोनों संख्याओं के लिए छंटनी का प्रभाव पड़ता है। जैसा कि डॉक में उदाहरण तालिका में देखा गया है ।
बेसिल बोर्के

23

बिट ओल्ड फोरम, उपरोक्त उत्तर में से किसी ने भी सकारात्मक और नकारात्मक दोनों मूल्यों के लिए काम नहीं किया (मेरा मतलब है कि गणना के लिए और सिर्फ राउंडिंग के बिना ट्रंकेट करना है)। जावा लिंक में एन से दशमलव स्थानों के लिए एक नंबर को गोल करने के लिए कैसे

private static BigDecimal truncateDecimal(double x,int numberofDecimals)
{
    if ( x > 0) {
        return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_FLOOR);
    } else {
        return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_CEILING);
    }
}

इस विधि ने मेरे लिए ठीक काम किया।

System.out.println(truncateDecimal(0, 2));
    System.out.println(truncateDecimal(9.62, 2));
    System.out.println(truncateDecimal(9.621, 2));
    System.out.println(truncateDecimal(9.629, 2));
    System.out.println(truncateDecimal(9.625, 2));
    System.out.println(truncateDecimal(9.999, 2));
    System.out.println(truncateDecimal(-9.999, 2));
    System.out.println(truncateDecimal(-9.0, 2));

परिणाम:

0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00

इस जवाब मोर स्केलेबल अधिक परीक्षण मामले के लिए है
डिएगो माटोस - keke

नए BigDecimal (x) .setScale (numberofDecimals, RoundingMode.DOWN) .doubleValue () लौटाएं;
शिमोन डूडकिन

ऐसा लगता है कि आपका मतलब क्या है: docs.oracle.com/javase/7/docs/api/java/math/RoundingMode.html
शिमोन डूडकिन

9

पहले ध्यान दें कि एक doubleबाइनरी अंश है और वास्तव में दशमलव स्थान नहीं है।

यदि आपको दशमलव स्थानों की आवश्यकता है, तो ए का उपयोग करें BigDecimal, जिसमें setScale()ट्रंकेशन के लिए एक विधि है, या DecimalFormatए प्राप्त करने के लिए उपयोग करें String


7

यदि, जो भी कारण से, आप इसका उपयोग नहीं करना चाहते हैं, तो BigDecimalआप अपने doubleको intइसे छोटा कर सकते हैं।

यदि आप लोगों को जगह से अलग करना चाहते हैं :

  • बस के लिए डाल दिया int

करने के लिए दसवां जगह:

  • दस से गुणा करें
  • कास्ट किया int
  • वापस कास्ट किया double
  • और दस से भाग दो।

हुंद्रेत जगह

  • 100 आदि से गुणा और भाग करें।

उदाहरण:

static double truncateTo( double unroundedNumber, int decimalPlaces ){
    int truncatedNumberInt = (int)( unroundedNumber * Math.pow( 10, decimalPlaces ) );
    double truncatedNumber = (double)( truncatedNumberInt / Math.pow( 10, decimalPlaces ) );
    return truncatedNumber;
}

इस उदाहरण में, decimalPlaces स्थानों की संख्या होगी अतीत जिन्हें आप जाना चाहते जगह है, तो 1 होगा दौर में दसवां स्थान, 2 को सैकड़ा , और इतने पर करने के लिए (0 राउंड वाले जगह है, और दसियों नकारात्मक एक , आदि।)


3
यह एक भयानक सामान्य समाधान है। दोनों बहुतायत और कलाकारों के डेटा को फेंक देंगे और परिणामस्वरूप प्रभावी रूप से यादृच्छिक संख्या unroundedNumberमें बड़े होंगे। यह प्रश्न में उदाहरण के लिए काम कर सकता है, लेकिन किसी भी समाधान के लिए एक सामान्य समाधान काम करना चाहिए double
BLM

4

एक स्ट्रिंग के रूप में तैयार करना और वापस डबल में परिवर्तित करना मुझे लगता है कि आपको इच्छित परिणाम देगा।

दोहरा मूल्य गोल (), फर्श () या छत () नहीं होगा।

इसके लिए एक त्वरित सुधार हो सकता है:

 String sValue = (String) String.format("%.2f", oldValue);
 Double newValue = Double.parseDouble(sValue);

आप प्रदर्शन प्रयोजनों के लिए sValue या गणना के लिए newValue का उपयोग कर सकते हैं।


1
यह मेरे लिए निकटतम मूल्य के लिए गोल करता है। उदाहरण के लिए: 0.018 को 0.02 में बदला जाता है जब मैंने ऐसा किया था।
करण पटेल 5

3

हो सकता है Math.floor(value * 100) / 100? खबरदार कि जैसे मूल्यों का 3.54प्रतिनिधित्व नहीं किया जा सकता है double


3

आप कार्य को पूरा करने के लिए NumberFormat क्लास ऑब्जेक्ट का उपयोग कर सकते हैं।

// Creating number format object to set 2 places after decimal point
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);            
nf.setGroupingUsed(false);

System.out.println(nf.format(precision));// Assuming precision is a double type variable

3

3.545555555 को 3.54 प्राप्त करना है। इसके लिए निम्नलिखित प्रयास करें:

    DecimalFormat df = new DecimalFormat("#.##");

    df.setRoundingMode(RoundingMode.FLOOR);

    double result = new Double(df.format(3.545555555);

यह = 3.54 देगा!


1

यहाँ मैं प्रयोग विधि है:

double a=3.545555555; // just assigning your decimal to a variable
a=a*100;              // this sets a to 354.555555
a=Math.floor(a);      // this sets a to 354
a=a/100;              // this sets a to 3.54 and thus removing all your 5's

यह भी किया जा सकता है:

a=Math.floor(a*100) / 100;

0

शायद निम्नलिखित:

double roundTwoDecimals(double d) { 
      DecimalFormat twoDForm = new DecimalFormat("#.##"); 
      return Double.valueOf(twoDForm.format(d));
}  

अन्य उत्तर देखें। यदि आप इसका उत्तर फ़्लोटिंग पॉइंट में दर्शाते हैं, तो आप इसे मज़बूती से नहीं कर सकते हैं।
को लोर्न

0

एक त्वरित जाँच Math.floor विधि का उपयोग करना है। मैंने नीचे दो या कम दशमलव स्थानों के लिए एक डबल जाँचने के लिए एक विधि बनाई:

public boolean checkTwoDecimalPlaces(double valueToCheck) {

    // Get two decimal value of input valueToCheck 
    double twoDecimalValue = Math.floor(valueToCheck * 100) / 100;

    // Return true if the twoDecimalValue is the same as valueToCheck else return false
    return twoDecimalValue == valueToCheck;
}

-1

मेरे पास मणि का थोड़ा संशोधित संस्करण है ।

private static BigDecimal truncateDecimal(final double x, final int numberofDecimals) {
    return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_DOWN);
}

public static void main(String[] args) {
    System.out.println(truncateDecimal(0, 2));
    System.out.println(truncateDecimal(9.62, 2));
    System.out.println(truncateDecimal(9.621, 2));
    System.out.println(truncateDecimal(9.629, 2));
    System.out.println(truncateDecimal(9.625, 2));
    System.out.println(truncateDecimal(9.999, 2));
    System.out.println(truncateDecimal(3.545555555, 2));

    System.out.println(truncateDecimal(9.0, 2));
    System.out.println(truncateDecimal(-9.62, 2));
    System.out.println(truncateDecimal(-9.621, 2));
    System.out.println(truncateDecimal(-9.629, 2));
    System.out.println(truncateDecimal(-9.625, 2));
    System.out.println(truncateDecimal(-9.999, 2));
    System.out.println(truncateDecimal(-9.0, 2));
    System.out.println(truncateDecimal(-3.545555555, 2));

}

आउटपुट:

0.00
9.62
9.62
9.62
9.62
9.99
9.00
3.54
-9.62
-9.62
-9.62
-9.62
-9.99
-9.00
-3.54

-2

यह मेरे लिए काम किया:

double input = 104.8695412  //For example

long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;

//result == 104.87

मुझे व्यक्तिगत रूप से यह संस्करण पसंद है क्योंकि यह वास्तव में राउंडिंग को संख्यात्मक रूप से करता है, बजाय इसे एक स्ट्रिंग (या समान) में परिवर्तित करके और फिर इसे फ़ॉर्मेट करने के द्वारा।


1
मूल प्रश्न ट्रंकिंग के बारे में है, राउंडिंग के बारे में नहीं। इसके अलावा, एक डबल को लंबे समय तक परिवर्तित करने से सभी पर अच्छा काम नहीं करेगा यदि डबल पर्याप्त बड़ा है।
BLM

-2
//if double_v is 3.545555555
String string_v= String.valueOf(double_v);
int pointer_pos = average.indexOf('.');//we find the position of '.'
string_v.substring(0, pointer_pos+2));// in this way we get the double with only 2 decimal in string form
double_v = Double.valueOf(string_v);//well this is the final result

अच्छी तरह से यह थोड़ा अजीब हो सकता है, लेकिन मुझे लगता है कि यह आपकी समस्या को हल कर सकता है :)


इस कोड से काम पूरा हो जाता है, लेकिन यह सुरुचिपूर्ण नहीं है और इसका प्रदर्शन खराब है। स्कूल परियोजनाओं में यह ठीक हो सकता है, लेकिन निश्चित रूप से कोई समाधान नहीं है जो किसी भी प्रणाली के उत्पादन में उपयोग करेगा, जब तक कि आप बाद में सिरदर्द नहीं चाहते हैं।
cbaldan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.