আমি কীভাবে জাভা ব্যবহার করে বৈজ্ঞানিক স্বরলিপি ছাড়াই ডাবল মান মুদ্রণ করব?


221

আমি জাভাতে দ্বৈত মানটি তাত্ক্ষণিক ফর্ম ছাড়াই মুদ্রণ করতে চাই।

double dexp = 12345678;
System.out.println("dexp: "+dexp);

এটা এই ই স্বরলিপি দেখায়: 1.2345678E7

আমি এটি এটি এই যেমন মুদ্রণ করতে চান: 12345678

এটি প্রতিরোধের সর্বোত্তম উপায় কী?

উত্তর:


116

আপনি এর printf()সাথে ব্যবহার করতে পারেন %f:

double dexp = 12345678;
System.out.printf("dexp: %f\n", dexp);

এটি মুদ্রণ করবে dexp: 12345678.000000। আপনি যদি ভগ্নাংশের অংশটি না চান তবে ব্যবহার করুন

System.out.printf("dexp: %.0f\n", dexp);

এটি ডকুমেন্টেশনে বর্ণিত ফর্ম্যাট সুনির্দিষ্ট ভাষা ব্যবহার করে

ডিফল্ট toString()আপনার মূল কোডে ব্যবহৃত বিন্যাস বানান আউট হয় এখানে


1
তবে এটি dexp: 12345681.000000কোন ভুল মানটি তা দেখিয়েছে ndআর এর পরে আমি এটি আমার ওয়েব পৃষ্ঠায় এটি প্রদর্শন করতে চাই যেখানে এটি এটির মতো প্রদর্শিত হয় 1.2345678E7.আমি সেখানে যাইহোক, যার মাধ্যমে আমি এটি কোনও দ্বিগুণ 12345678এবং অন্য কোনও উপায়ে সংরক্ষণ করতে পারি?
হতাশ

1
@ বর্ণনামূলক: আপনি হয়ত উত্তরের পুরানো, অসম্পূর্ণ সংস্করণটি দেখছেন। পৃষ্ঠাটি পুনরায় লোড করার চেষ্টা করুন। সম্পর্কে একটি অনুচ্ছেদ থাকা উচিত %.0f
এনপিই

@ স্পষ্টরূপে আপনি ডিপ এক্সকে ইনট হিসাবে সংরক্ষণ করতে পারবেন যাতে আপনি এটি সহজেই উভয় উপায়ে ব্যবহার করতে পারেন
জাস্টিন

10
এটি বন্ধ চক্রের NUMBER টি
গুলান

6
%.0fসংখ্যাটি বন্ধ করে দেয়। পেছনের শূন্যগুলি ফেলে দেওয়ার কি কোনও উপায় আছে?
নুরশমিক

239

জাভা একটি ডাবল ই সংকেত প্রতিরোধ:

ডাবলকে সাধারণ সংখ্যায় রূপান্তর করার জন্য পাঁচটি ভিন্ন উপায়:

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class Runner {
    public static void main(String[] args) {
        double myvalue = 0.00000021d;

        //Option 1 Print bare double.
        System.out.println(myvalue);

        //Option2, use decimalFormat.
        DecimalFormat df = new DecimalFormat("#");
        df.setMaximumFractionDigits(8);
        System.out.println(df.format(myvalue));

        //Option 3, use printf.
        System.out.printf("%.9f", myvalue);
        System.out.println();

        //Option 4, convert toBigDecimal and ask for toPlainString().
        System.out.print(new BigDecimal(myvalue).toPlainString());
        System.out.println();

        //Option 5, String.format 
        System.out.println(String.format("%.12f", myvalue));
    }
}

এই প্রোগ্রামটি মুদ্রণ:

2.1E-7
.00000021
0.000000210
0.000000210000000000000001085015324114868562332958390470594167709350585
0.000000210000

যা সব একই মান।

প্রতিলিপি: যদি আপনি দ্বিধাগ্রস্থ হন যে এই র্যান্ডম ডিজিটগুলি দ্বিগুণ মানের একটি নির্দিষ্ট প্রান্তিকের বাইরে কেন উপস্থিত হয়, তবে এই ভিডিওটি ব্যাখ্যা করেছে: কম্পিউটারফিল কেন 0.1+ 0.2সমান 0.30000000000001?

http://youtube.com/watch?v=PZRI1IfStY0


উত্তরের জন্য এবং বিশেষত টিপসের জন্য অনেক ধন্যবাদ .. এই ভিডিওটি আমার বিভ্রান্তির সমাধান করেছে।
অনুজদেও

97

সংক্ষেপে:

আপনি যদি পিছনের জিরো এবং স্থানীয় সমস্যাগুলি থেকে মুক্তি পেতে চান তবে আপনার ব্যবহার করা উচিত:

double myValue = 0.00000021d;

DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
df.setMaximumFractionDigits(340); // 340 = DecimalFormat.DOUBLE_FRACTION_DIGITS

System.out.println(df.format(myValue)); // Output: 0.00000021

ব্যাখ্যা:

অন্যান্য উত্তরগুলি আমার পক্ষে কেন উপযুক্ত নয়:

  • Double.toString()বা System.out.printlnবাFloatingDecimal.toJavaFormatString দ্বিগুণ 10 ^ -3 এর চেয়ে কম বা 10 ^ 7 এর সমান হলে বৈজ্ঞানিক স্বরলিপি ব্যবহার করে
  • ব্যবহার করে %f, ডিফল্ট দশমিক যথার্থতা 6 হয়, অন্যথায় আপনি এটি হার্ডকোড করতে পারেন, তবে এটির দশমিক কম থাকলে অতিরিক্ত জিরো যুক্ত হয়। উদাহরণ:

    double myValue = 0.00000021d;
    String.format("%.12f", myvalue); // Output: 0.000000210000
  • ব্যবহার করে setMaximumFractionDigits(0);বা %.0fআপনি কোনও দশমিক নির্ভুলতা সরিয়ে ফেলেন, যা পূর্ণসংখ্যার / দীর্ঘস্থায়ী জন্য ঠিক, তবে দ্বিগুণ নয়:

    double myValue = 0.00000021d;
    System.out.println(String.format("%.0f", myvalue)); // Output: 0
    DecimalFormat df = new DecimalFormat("0");
    System.out.println(df.format(myValue)); // Output: 0
  • ডেসিমালফর্ম্যাট ব্যবহার করে আপনি স্থানীয় নির্ভর। ফরাসি লোকালে দশমিক বিভাজক কমা, বিন্দু নয়:

    double myValue = 0.00000021d;
    DecimalFormat df = new DecimalFormat("0");
    df.setMaximumFractionDigits(340);
    System.out.println(df.format(myvalue)); // Output: 0,00000021

    ENGLISH লোকেল ব্যবহার করা নিশ্চিত করে যে আপনি যেখানেই প্রোগ্রাম চালাবেন দশমিক বিভাজকের জন্য একটি পয়েন্ট পেয়েছেন।

340 এর জন্য কেন ব্যবহার করছেন setMaximumFractionDigits?

দুটি কারণ:

  • setMaximumFractionDigitsএকটি পূর্ণসংখ্যা গ্রহণ করে তবে এর বাস্তবায়নে সর্বাধিক সংখ্যা রয়েছে DecimalFormat.DOUBLE_FRACTION_DIGITSযার মধ্যে 340 সমান
  • Double.MIN_VALUE = 4.9E-324 সুতরাং 340 সংখ্যার সাথে আপনি নিজের ডাবল গোল না করে নিশ্চিত হয়ে গেছেন ision

আপনার মতামতটি কী new BigDecimal(myvalue).toPlainString()বিষয়ে ডকস.অরাকল . com/javase/7/docs/api/java/math/… ) এ বর্ণনা থেকে দেখা যায় , এটি বিভিন্ন ধরণের সংখ্যা দেওয়া হলে এটি কীভাবে আচরণ করে তা তাত্ক্ষণিকভাবে সুস্পষ্ট নয়, তবে এটি বৈজ্ঞানিক স্বরলিপিটি অপসারণ করে ।
ডেরেক মাহর

4
new BigDecimal(0.00000021d).toPlainString()আউটপুট 0.0000002100000000000000010850153241148685623329583904705941677093505859375যা আপনার প্রত্যাশা মতো নয় ...
জেবিই

আপনার উত্তর কীভাবে স্কালায় ব্যবহার করবেন? সম্ভবত উপযুক্ত আমদানির বিষয়টি তবে আমি এখানে নতুন।
জঙ্গোরেকি

BigDecimal.valueOf(0.00000021d).toPlainString()পাশাপাশি কাজ (এটা যে কেন BigDecimal এর স্ট্রিং কন্সট্রাকটর ব্যবহার করে)
মার্কো

27

আপনি এটি দিয়ে চেষ্টা করতে পারেন DecimalFormat। এই শ্রেণীর সাহায্যে আপনি আপনার সংখ্যাগুলি বিশ্লেষণে খুব নমনীয়।
আপনি যে প্যাটার্নটি ব্যবহার করতে চান তা আপনি ঠিক সেট করতে পারেন।
উদাহরণস্বরূপ আপনার ক্ষেত্রে:

double test = 12345678;
DecimalFormat df = new DecimalFormat("#");
df.setMaximumFractionDigits(0);
System.out.println(df.format(test)); //12345678

16

বিগডিসিমালের টু প্লেনস্ট্রিং () এর সাথে জড়িত আমি আরও একটি সমাধান পেয়েছি, তবে এবার স্ট্রিং-কনস্ট্রাক্টর ব্যবহার করে, যা জাভাডকে সুপারিশ করা হয়েছে:

এই কন্সট্রাক্টর ফ্লোট.টোস্ট্রিং এবং ডাবল টো স্ট্রিংয়ের সাথে ফিরে আসা মানগুলির সাথে সামঞ্জস্যপূর্ণ। এটি সাধারণত ফ্লোট বা ডাবলটিকে বিগডিসিমাল রূপান্তর করার জন্য পছন্দসই উপায়, কারণ এটি বিগডিসিমাল (ডাবল) কনস্ট্রাক্টরের অপ্রত্যাশিততায় ভুগছেন না।

এটি এর সংক্ষিপ্ত আকারে এটির মতো দেখাচ্ছে:

return new BigDecimal(myDouble.toString()).stripTrailingZeros().toPlainString();

জাভা 8 এর পূর্বে, কোনও শূন্য-মূল্যবান ডাবলসের জন্য এটি "0.0" এ ফলাফল দেয়, সুতরাং আপনাকে যুক্ত করতে হবে:

if (myDouble.doubleValue() == 0)
    return "0";

NaN এবং অসীম মানগুলি অতিরিক্ত পরীক্ষা করতে হবে।

এই সমস্ত বিবেচনার চূড়ান্ত ফলাফল:

public static String doubleToString(Double d) {
    if (d == null)
        return null;
    if (d.isNaN() || d.isInfinite())
        return d.toString();

    // Pre Java 8, a value of 0 would yield "0.0" below
    if (d.doubleValue() == 0)
        return "0";
    return new BigDecimal(d.toString()).stripTrailingZeros().toPlainString();
}

এটি ফ্লোটের সাথে সুন্দরভাবে কাজ করার জন্য অনুলিপি / আটকানো যায়।


2
আমি একটি স্ট্রিংয়ে একটি ডাবল মান রূপান্তর করতে অসংখ্য স্কিম পড়েছি এবং এটি সেরা: সংক্ষিপ্ত, সোজা, কনফিগারযোগ্য।
পল

দুর্দান্ত সমাধান, সত্যই আমাকে স্ট্রিংয়ে দ্বৈত মান রূপান্তরিত করতে এবং বৈজ্ঞানিক স্বরলিপি এড়ানোর ক্ষেত্রে সহায়তা করেছে। ধন্যবাদ!

এর d.doubleValue() == 0বদলে কেন d == 0?
আলেক্সি ফ্যান্ডো

কারণ এটি অটো-আনবক্সিং এড়ায়, যা আমি সেই পরিস্থিতিতে আরও ভাল পছন্দ করি তবে এর মধ্যে অবশ্যই দেখা যেতে পারে। আপনি যদি জাভা 8 এ থাকেন (9 সম্ভবত একই হবে) তবে আপনি সেই 2 টি লাইন পুরোপুরি ছেড়ে দিতে পারেন।
ম্যানুয়েল

মাত্র জাভা 9 দিয়ে চেষ্টা করা, 9 টির জন্যও এই 2 টি লাইন ছেড়ে যেতে পারে।
ম্যানুয়েল

8

আপনার সংখ্যাটি পুরো সংখ্যা হিসাবে এটি কাজ করবে:

double dnexp = 12345678;
System.out.println("dexp: " + (long)dexp);

দশমিক পয়েন্টের পরে যদি ডাবল ভেরিয়েবলের যথার্থতা থাকে তবে এটি এটি কেটে যাবে।


4

আমার কিছু মুদ্রার মানগুলিতে ডাবল রূপান্তর করা প্রয়োজন এবং সন্ধান পেয়েছি যে বেশিরভাগ সমাধান ঠিক আছে, তবে আমার পক্ষে নয়।

DecimalFormatঅবশেষে আমার জন্য উপায় ছিল, তাই এটি হলো আমি কি কাজ করেছি হল:

   public String foo(double value) //Got here 6.743240136E7 or something..
    {
        DecimalFormat formatter;

        if(value - (int)value > 0.0)
            formatter = new DecimalFormat("0.00"); // Here you can also deal with rounding if you wish..
        else
            formatter = new DecimalFormat("0");

        return formatter.format(value);
    }

আপনি দেখতে পাচ্ছেন, সংখ্যাটি যদি প্রাকৃতিক হয় তবে আমি বলি - 2E7 (ইত্যাদি) এর পরিবর্তে 20000000 - কোনও দশমিক বিন্দু ছাড়াই।

এবং যদি এটি দশমিক হয়, আমি মাত্র দুটি দশমিক সংখ্যা পাই।


4

জাভা / কোটলিন সংকলক 9999999 (10 মিলিয়নের চেয়ে বেশি বা সমান) এর চেয়ে বেশি যে কোনও মানকে বৈজ্ঞানিক স্বরলিপিতে রূপান্তর করে। অ্যাপসিলিয়ন স্বরলিপি

উদাঃ 12345678 1.2345678E7 তে রূপান্তরিত হয়েছে

বৈজ্ঞানিক স্বরলিপিতে স্বয়ংক্রিয় রূপান্তর এড়ানোর জন্য এই কোডটি ব্যবহার করুন:

fun setTotalSalesValue(String total) {
        var valueWithoutEpsilon = total.toBigDecimal()
        /* Set the converted value to your android text view using setText() function */
        salesTextView.setText( valueWithoutEpsilon.toPlainString() )
    }

3

প্রদত্ত নম্বরটি বৈজ্ঞানিক স্বরলিপিতে উপস্থাপন করা থাকলে নিম্নলিখিত কোডটি সনাক্ত করে। যদি তাই হয় তবে এটি সর্বাধিক '25' সংখ্যা সহ সাধারণ উপস্থাপনায় উপস্থাপিত হয়।

 static String convertFromScientificNotation(double number) {
    // Check if in scientific notation
    if (String.valueOf(number).toLowerCase().contains("e")) {
        System.out.println("The scientific notation number'"
                + number
                + "' detected, it will be converted to normal representation with 25 maximum fraction digits.");
        NumberFormat formatter = new DecimalFormat();
        formatter.setMaximumFractionDigits(25);
        return formatter.format(number);
    } else
        return String.valueOf(number);
}

1

আমি মনে করি প্রত্যেকের সঠিক ধারণা ছিল তবে সমস্ত উত্তর সোজা ছিল না। আমি দেখতে পাচ্ছি এটি কোডের একটি খুব দরকারী অংশ। কী কাজ করবে তার একটি স্নিপেট এখানে:

System.out.println(String.format("%.8f", EnterYourDoubleVariableHere));

".8"আপনাকে দেখাতে চাই যেখানে আপনি দশমিক স্থান সংখ্যা সেট।

আমি Eclipse ব্যবহার করছি এবং এতে কোনও সমস্যা হয়নি।

আশা করি এটি সহায়ক ছিল। আমি যেকোন ফিরতি তথ্যে একমত পোষণ করব!


1

আমার প্রোডাকশন কোডে আমার একই সমস্যা ছিল যখন আমি এটি একটি গণিতে স্ট্রিং ইনপুট হিসাবে ব্যবহার করি। প্রথম () ফাংশন যা "x + 20/50" এর মতো স্ট্রিং নেয়

আমি কয়েকশ নিবন্ধের দিকে চেয়েছিলাম ... শেষ পর্যন্ত গতির কারণে আমি এটি নিয়ে চলেছি। এবং যেহেতু ইভাল ফাংশন এটিকে আবার নিজের নম্বর ফর্ম্যাটে রূপান্তর করতে চলেছে অবশেষে এবং গণিতে E ।

এটি এখন এমন অ্যাপ্লিকেশনটির জন্য উত্পাদন কোডে ব্যবহৃত হয় যার এক হাজার++ ব্যবহারকারী ...

double value = 0.0002111d;
String s = Double.toString(((int)(value * 100000.0d))/100000.0d); // Round to 5 dp

s display as:  0.00021

1

এটি স্পর্শকাতর হতে পারে .... তবে যদি আপনাকে সিরিয়াল হিসাবে (জেএসএন, ইত্যাদি) একটি পূর্ণসংখ্যা হিসাবে সংখ্যার মান (এটি একটি পূর্ণসংখ্যা হিসাবে অনেক বড়) দরকার হয় তবে আপনি সম্ভবত "বিগইন্টারটার" চান

উদাহরণ: মানটি একটি স্ট্রিং - 7515904334

আমাদের এটি একটি জাসন বার্তায় একটি সংখ্যাসূচক হিসাবে উপস্থাপন করতে হবে: {"যোগাযোগ_ফোন": "800220-3333", "সার্ভিস_আইডি": 7515904334, "সার্ভিস_র নাম": "কিছু সংস্থান"}

আমরা এটি মুদ্রণ করতে পারি না বা আমরা এটি পেয়ে যাব: contact "যোগাযোগ_ফোন": "800220-3333", "সার্ভিস_আইডি": "7515904334", "সার্ভিস_র নাম": "কিছু কর্পোরেশন"}

এর মতো নোডে মান যুক্ত করা পছন্দসই ফলাফল তৈরি করে: BigInteger.valueOf (Long.parseLong (মান, 10))

আমি সত্যই এটি অনন্য বিষয় সম্পর্কে নিশ্চিত নই, তবে যেহেতু আমার সমাধানটি অনুসন্ধান করার সময় এই প্রশ্নটি আমার শীর্ষে ছিল, তাই আমি ভেবেছিলাম যে আমি এখানে অন্যের সুবিধার্থে ভাগ করে নেব, আমাকে মিথ্যা বলব, যারা খারাপ অনুসন্ধান করে। : ডি


-1

একটি দ্বারা প্রতিনিধিত্ব পূর্ণসংখ্যার মানগুলির জন্য double, আপনি এই কোডটি ব্যবহার করতে পারেন যা অন্যান্য সমাধানগুলির চেয়ে অনেক দ্রুত is

public static String doubleToString(final double d) {
    // check for integer, also see https://stackoverflow.com/a/9898613/868941 and
    // https://github.com/google/guava/blob/master/guava/src/com/google/common/math/DoubleMath.java
    if (isMathematicalInteger(d)) {
        return Long.toString((long)d);
    } else {
        // or use any of the solutions provided by others
        return Double.toString(d);
    }
}

// Java 8+
public static boolean isMathematicalInteger(final double d) {
    return StrictMath.rint(d) == d && Double.isFinite(d);
}

-1

আমার সমাধান: স্ট্রিং স্ট্রিং = স্ট্রিং.ফর্ম্যাট ("% .0f", আপনার ডাবল);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.