দশমিক স্থানে ফ্লোট ফর্ম্যাট করুন


220

আমার দশমিক স্থানে "n" ফ্লোটের ফর্ম্যাট করতে হবে।

বিগডিসিমাল করার চেষ্টা করছিল, তবে ফেরতের মানটি সঠিক নয় ...

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(java.util.Locale.US,"%.2f", floatValue);
গমনো

6
এই উত্তরটি একটি ফ্ল্যাট মান নয়, একটি স্ট্রিং মান দেয়, আমি ভাল উত্তর মনে করি না।
ZhaoGang

3
আপনি কেন বিচ্ছেদ হিসাবে একটি বিন্দু বাধ্য করবেন?
মার্ক বুয়েকিমা

1
@ মারকবুইকমা আমার মনে হয় এমন কিছু মামলা রয়েছে যেখানে এটি একেবারে প্রয়োজনীয় হবে যেমন মানদণ্ড দ্বারা চালিত নথি বিন্যাসগুলি সংকলন করার সময়, যেমন। পিডিএফ ডকুমেন্টস।
Tjaart

39

ডেসিমালফোর্ডে একবার দেখুন । আপনি সহজেই এটি একটি নম্বর নিতে এবং এটি একটি দশমিক স্থানের সেট নম্বর দিতে ব্যবহার করতে পারেন।

সম্পাদনা : উদাহরণ


1
+1 টি। এখানে অ্যান্ড্রয়েড-নির্দিষ্ট ডকুমেন্টেশন রয়েছে , যা মূলত একই হওয়া উচিত।
জাচ এল

তবে আমার ফলাফলটি প্রয়োজন একটি ফ্লোট সংখ্যা, স্ট্রিং নয়।
seba123neo

আপনি কি ভাসাটি গোল করতে চান বলছেন? সাধারণত ভাসমান বিষয়গুলির একমাত্র সময় নির্ভুলতা প্রদর্শনের জন্য।
নিক ক্যাম্পিয়ন

দুঃখিত, আপনি ঠিক বলেছেন, আমি বিভ্রান্ত হয়ে পড়েছি, স্ক্রিনে দেখানোর সময় কেবলমাত্র ফর্ম্যাট করুন, এটি আমার প্রশ্ন ছিল না, আপনাকে অনেক ধন্যবাদ, সমস্যা সমাধান হয়েছে।
seba123neo

দ্রষ্টব্য, DecimalFormatনির্মাণকারীর ব্যবহার নিরুত্সাহিত করা হয়েছে, এর সঠিক ব্যবহারের জন্য আমার উত্তরটি দেখুন NumberFormat
এফবিবি

17

এটি চেষ্টা করুন এটি আমাকে অনেক সাহায্য করেছে

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

ফলাফলটি রাউন্ডফাইনালপ্রাইস -> 5652.26 হবে


2
এটি আরও ঘন ঘন এবং এটির সাথে আরও কিছু গণনা করার জন্য আরও কার্যকর, অন্যথায়, আরভের উত্তর সম্ভবত সেরা।
জেরার্ড

এটি জিডাব্লুটিটির সাথেও কাজ করে। String.format () - না।
আলেকজভি

15

লক্ষণীয়, 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));

এটি যখন কাজ করছে না (উদাহরণস্বরূপ) ফ্লোটভ্যালু = 8.499। এটি দিচ্ছে 8.5।
শিব কৃষ্ণ চিপা

3
@ শিবকৃষ্ণচীপা: হ্যাঁ, কারণ এখানে আমরা উল্লেখ করেছি যে কমা পরে আমরা দুটি সংখ্যা চাই এবং একটি বৃত্তাকারীকরণ করব। সেক্ষেত্রে 8.499 এর 8.5 গোল হয় is আপনি যদি 8.499 টি প্রদর্শিত হতে চান তবে সর্বাধিক ভগ্নাংশের সংখ্যা হিসাবে 3 সেট করুন।
এফবিবি

6

DecimalFormatনিক দ্বারা উল্লিখিত ক্লাসটি ব্যবহার করে এখানে একটি দ্রুত নমুনা দেওয়া হয়েছে।

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

মুদ্রণ বিবৃতিটির আউটপুট হবে 12.35। লক্ষ্য করুন যে এটি আপনার জন্য এটি গোল করবে।


দ্রষ্টব্য, DecimalFormatনির্মাণকারীর ব্যবহার নিরুত্সাহিত করা হয়েছে, এর সঠিক ব্যবহারের জন্য আমার উত্তরটি দেখুন NumberFormat
এফবিবি

5

কিন্ডা অবাক করে কারও কাছে সরাসরি কাজ করার উপায় দেখায়নি, এটি যথেষ্ট সহজ।

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

খুব নিশ্চিত যে এটি যদিও অর্ধ-এমনকি গোল করে না।

এটির মূল্যের জন্য, আপনি যখন বেস -10 পাটিগণিতের সাথে বাইনারি-ভিত্তিক ভাসমান-পয়েন্ট মানগুলি মিশ্রিত করেন তখন অর্ধ-সমান বৃত্তাকারটি বিশৃঙ্খলাবদ্ধ এবং অনির্দেশ্য হতে চলেছে। আমি নিশ্চিত যে এটি করা যাবে না। মূল সমস্যাটি হ'ল 1.105 এর মতো মানটি ভাসমান পয়েন্টে হুবহু উপস্থাপন করা যায় না। ভাসমান পয়েন্টের মানটি 1.1050000000000011 বা 1.104999999999999 এর মতো কিছু হতে চলেছে। সুতরাং অর্ধ-সম-বৃত্তাকারী করার যে কোনও প্রয়াস প্রতিনিধিত্বমূলক এনকোডিংয়ের ত্রুটিগুলিতে ট্রিপ করে চলেছে।

আইইইই ফ্লোটিং পয়েন্ট বাস্তবায়নগুলি অর্ধ-রাউন্ডিং করবে, তবে তারা বাইনারি অর্ধ-রাউন্ডিং করে, দশমিক অর্ধ-বৃত্তাকার নয়। সুতরাং আপনি সম্ভবত ঠিক আছেন


আমি এই পদ্ধতিটিও কিছু সময়ের জন্য ব্যবহার করেছি, তবে আমি কি মনে করব যে powএটি রাউন্ডিংয়ের জন্য ব্যবহার করা খুব ব্যয়বহুল অপারেশন?
জেরুস

আপনার কার্য সম্পাদন সমস্যা না হওয়া পর্যন্ত কখনই অনুকূলিত হন না। দ্রুত চেয়ে সঠিক হতে আরও গুরুত্বপূর্ণ। এবং আমি সত্যিই এমন কোনও অ্যাপ্লিকেশনটি কল্পনা করতে পারি না যেখানে নিয়ন্ত্রিত রাউন্ডিংয়ের পারফরম্যান্স একটি সমস্যা হয়ে দাঁড়াবে, যদি না আপনি ভিসা বা মাস্টারকার্ড (যিনি কেবল এটিতে আরও মেশিন নিক্ষেপ করবেন) না। এবং পাও () সম্ভবত বৃত্তাকার () এর চেয়ে দ্রুত।
রবিন ডেভিস 21

2
public static double roundToDouble(float d, int decimalPlace) {
        BigDecimal bd = new BigDecimal(Float.toString(d));
        bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
        return bd.doubleValue();
    }

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

আমি ভাবছি আপনি কি চান না

return value.toString();

এবং প্রদর্শনের জন্য রিটার্ন মানটি ব্যবহার করুন।

value.floatValue();

সর্বদা 625.3 ফেরত আসবে কারণ এটি মূলত কোনও কিছু গণনা করতে ব্যবহৃত হত।


তবে আমার ফলাফলটি প্রয়োজন একটি ফ্লোট সংখ্যা, স্ট্রিং নয়।
seba123neo

2
আপনার যদি এটি ব্যবহারকারীর কাছে দেখানোর জন্য একটি ফ্লোটের প্রয়োজন হয় তবে অ্যাপ্লিকেশনটির নকশায় কিছু ভুল হতে পারে। সাধারণত ভাসা গণনা করতে ব্যবহৃত হয় এবং এটি ব্যবহারকারীর কাছে দেখানোর জন্য একটি স্ট্রিং ব্যবহৃত হয়।
n3utrino

দুঃখিত, আপনি ঠিক বলেছেন, আমি বিভ্রান্ত হয়ে পড়েছি, স্ক্রিনে দেখানোর সময় কেবল সংখ্যাটি ফর্ম্যাট করুন, এটি আমার প্রশ্ন ছিল না, আপনাকে অনেক ধন্যবাদ, সমস্যা সমাধান হয়েছে।
seba123neo

1

আমি এই প্রশ্নের উত্তর খুঁজছিলাম এবং পরে আমি একটি পদ্ধতি বিকাশ করেছি! :) একটি ন্যায্য সতর্কতা, এটি মানটি চারপাশে ing

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.