আমি কীভাবে জাভাতে কেবলমাত্র একটি ডাবল থেকে দুটি দশমিক জায়গায় কাটাতে পারি?


98

উদাহরণস্বরূপ আমার কাছে ভেরিয়েবল 3.545555555 রয়েছে, যা আমি কেবল 3.54 এ কাটাতে চাই।


21
এটি কোনও সদৃশ নয়। ছাঁটাই করা এবং গোল করা দুটি সম্পূর্ণ আলাদা জিনিস।
মার্কথেগ্রিয়া

সম্মত হন, কেন এটি নকল হিসাবে পতাকাঙ্কিত করা হয়েছে তা জানেন না।
বেসিনেটর

উত্তর:


147

যদি আপনি এটি প্রদর্শনের উদ্দেশ্যে করতে চান তবে ব্যবহার করুন java.text.DecimalFormat:

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

আপনার যদি গণনার জন্য এটির প্রয়োজন হয়, ব্যবহার করুন java.lang.Math:

 Math.floor(value * 100) / 100;

50
এটি 3.545555555 থেকে 3.54 কেটে ছাড়াই প্রদর্শন করবে না , তবে এটি 3.55 এ গোল হবে। ডেসিমাল ফরম্যাট.সেট রাউন্ডিংমোড () রাউন্ডিংমোডে সেট করা দরকার F
খ্রিস্টান গার্সিয়া

9
এটি আমার জন্য কাজ করে না ম্যাথ.ফ্লুর (9.62 * 100) / 100 দেয় 9.61
মণি

4
ছাঁটাই floorকরতে ব্যবহার করা কেবল ইতিবাচক মানগুলির জন্য কাজ করে।
দেব

4
@ ChristianGarcía truncation সঠিকভাবে সঙ্গে সম্পন্ন করা হয় RoundingMode.DOWNহিসাবে RoudingMode.FLOORসবসময় নেতিবাচক অনন্ত প্রতি চক্রের।
দেব

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

উপলব্ধ চেক RoundingModeএবং DecimalFormat


গোলটি না করে কাটাকাটি চেয়েছে এমন প্রশ্নের সন্ধান করে না।
বেসিল বাউরকে

8
@ বাসিলবৌড়ক রাউন্ডিংমড.ডাউনটি কাটা কাটা। অন্যান্য উত্তরের সাথে তুলনা করুন যা ভুলভাবে ফ্লোর ফাংশনগুলির প্রস্তাব দেয় (তল কেবল ধনাত্মক সংখ্যাকে ছিন্ন করে), এটি ইতিবাচক এবং নেতিবাচক উভয় মানের জন্য সঠিকভাবে কাজ করে।
দেব

4
@ দেব আমি সংশোধন করে দাঁড়িয়ে আছি আমি এখন দেখতে পাচ্ছি যে DOWNইতিবাচক এবং negativeণাত্মক উভয় সংখ্যার জন্য কাটাকাটির প্রভাব আছে। হিসাবে উদাহরণ টেবিল দেখা ডক
তুলসী বাউরক

25

বিট ওল্ড ফোরাম, উপরের উত্তরের কোনওটিই ইতিবাচক এবং নেতিবাচক মান উভয়ের জন্যই কাজ করেনি (আমি গণনাটি বোঝাতে চাইছি এবং গোলটি না করে কেবল কাটা কাটা)। জাভা লিঙ্কের দশমিক স্থানে কোনও সংখ্যাকে কীভাবে গোল করবেন From

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

এই উত্তরটি mor লেহন মাপযোগ্য আরো পরীক্ষা ক্ষেত্রে জন্য
দিয়েগো Matos - Keke

নতুন বিগডিসিমাল (এক্স) .setScale (নম্বরফেস ডেসিমালস, রাউন্ডিংমোড.ডাউন)) .ডুবলভ্যালু ();
শিমন ডুডকিন

রাউন্ড ডাউন মনে হচ্ছে যা বোঝাতে চাইছে
শিমন ডুডকিন

9

নোট প্রথম যে একটি doubleএকটি বাইনারি ভগ্নাংশ এবং সত্যিই নেই আছে দশমিক স্থান।

আপনার যদি দশমিক স্থানের প্রয়োজন হয় তবে একটি ব্যবহার করুন BigDecimal, যার setScale()কাটা কাটা পদ্ধতি রয়েছে বা DecimalFormatএকটি পাওয়ার জন্য ব্যবহার করুন String


7

যদি যাই হোক না কেন, আপনি যদি এমন কোনও ব্যবহার করতে না চান তবে আপনি এটি কেটে ফেলতে একটি BigDecimalকাস্ট করতে পারেন ।doubleint

আপনাকে অগ্রভাগ ছাঁটিয়া করতে চান, বেশী স্থান:

  • কেবল কাস্ট করা int

করতে দশমাংশ জায়গা:

  • দশ দ্বারা গুণ
  • নিক্ষেপ int
  • ফেরত দেওয়া double
  • এবং দশ দ্বারা বিভক্ত।

Hundreths জায়গা

  • ১০০ ইত্যাদি দ্বারা গুণ এবং ভাগ করুন

উদাহরণ:

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 would রাউন্ডে দশমাংশ স্থান, 2 hundredths , ইত্যাদি (0 চক্রের বেশী জায়গা এবং দশ নেতিবাচক এক ইত্যাদি)


4
এটি একটি ভয়ানক সাধারণ সমাধান is গুণ এবং কাস্ট উভয়ই ডেটা ফেলে দেবে এবং ফলস্বরূপ unroundedNumberযথেষ্ট বড় হলে কার্যকরভাবে এলোমেলো সংখ্যাগুলি কী ফলাফল করবে are এটি প্রশ্নের উদাহরণের জন্য কাজ করতে পারে তবে সাধারণ সমাধানটি যে কোনওর জন্য কাজ করা উচিত double
blm

6

একটি স্ট্রিং হিসাবে গঠন এবং ডাবল ফিরে রূপান্তর আমার মনে হয় যে আপনি চান ফলাফল আপনাকে দিতে হবে।

দ্বিগুণ মান গোল (), তল () বা সিল () হবে না।

এটির জন্য দ্রুত সমাধানটি হ'ল:

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

আপনি প্রদর্শনের উদ্দেশ্যে sValue বা গণনার জন্য নতুন ভ্যালু ব্যবহার করতে পারেন।


4
এটি আমার কাছে নিকটতম মান পর্যন্ত গোল করে। যেমন: 0.018 0.02 এ রূপান্তরিত হয় যখন আমি এটি করেছি।
করণ পটেল

3

হতে পারে Math.floor(value * 100) / 100? সাবধান হোন যে এর মতো মানগুলি 3.54যথাযথভাবে একটি দ্বারা উপস্থাপিত না হতে পারে double


3

টাস্কটি সম্পাদনের জন্য আপনি নাম্বার ফর্ম্যাট ক্লাস অবজেক্টটি ব্যবহার করতে পারেন।

// 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 দেবে!


তবে আমি 3.5 পাব যদি আমি মানটি 3.50123 নির্ধারণ করি
সাইরাস

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

একটি দ্রুত চেক ম্যাথ.ফ্লুর পদ্ধতিটি ব্যবহার করা। আমি নীচে দুই বা তার চেয়ে কম দশমিক জায়গার জন্য একটি ডাবল যাচাই করার জন্য একটি পদ্ধতি তৈরি করেছি:

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

আমি ব্যক্তিগতভাবে এই সংস্করণটি পছন্দ করি কারণ এটি স্ট্রিং (বা অনুরূপ) রূপান্তর না করে এবং পরে এটি ফর্ম্যাট করার পরিবর্তে এটি সংখ্যাসূচকভাবে গোলটি সম্পাদন করে।


4
আসল প্রশ্নটি গোলাকার নয়, কাটানো নিয়ে। এছাড়াও, ডাবলকে দীর্ঘকে রূপান্তর করা ডাবল যথেষ্ট বড় হলে মোটেই ভাল কাজ করবে না।
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

আচ্ছা এটি কিছুটা বিশ্রী হতে পারে তবে আমি মনে করি এটি আপনার সমস্যার সমাধান করতে পারে :)


এই কোডটি কাজটি সম্পন্ন করে, তবে এটি মার্জিত নয় এবং এতে খারাপ অভিনয় রয়েছে। স্কুল প্রকল্পগুলিতে এটি ঠিক হতে পারে তবে আপনি পরবর্তী সময়ে মাথা ব্যথা না করতে চাইলে সমাধানটি কেউই কোনও সিস্টেমের জন্য উত্পাদনে ব্যবহার করতে পারে না।
সিব্লদান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.