পাটিগণিত অনুগ্রহ: "দশমিক প্রসার ছাড়াই; দশমিক ফলাফলের সঠিক কোনও সঠিক ফলাফল নেই "


507

নীচের কোডটি কেন নীচে প্রদর্শিত ব্যতিক্রম উত্থাপন করে?

BigDecimal a = new BigDecimal("1.6");
BigDecimal b = new BigDecimal("9.2");
a.divide(b) // results in the following exception.

ব্যতিক্রম:

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

উত্তর:


841

থেকে জাভা 11 BigDecimalডক্স :

যখন কোনও MathContextবস্তুকে 0 (উদাহরণস্বরূপ MathContext.UNLIMITED) এর নির্ভুলতার সেটিং সরবরাহ করা হয় , তখন গাণিতিক ক্রিয়াকলাপগুলি হুবহু হ'ল পাটিগণিত পদ্ধতিগুলি যেমন কোনও MathContextবস্তু নেয় না । (এটি একমাত্র আচরণ যা 5 এর পূর্বে প্রকাশে সমর্থিত হয়েছিল)

সঠিক ফলাফলটি গণনা MathContextকরার এক তাত্পর্য হিসাবে, 0 এর যথার্থ সেটিং সহ কোনও বস্তুর বৃত্তাকার মোড সেটিং ব্যবহৃত হয় না এবং এইভাবে অপ্রাসঙ্গিক। বিভাজনের ক্ষেত্রে, সঠিক ভাগফলের অসীম দীর্ঘ দশমিক প্রসারণ হতে পারে; উদাহরণস্বরূপ, 1 দ্বারা 3 দ্বারা বিভক্ত।

যদি ভাগফলটির একটি নির্বিঘ্ন দশমিক প্রসার থাকে এবং ক্রিয়াকলাপটি একটি সুনির্দিষ্ট ফলাফল প্রত্যাবর্তনের জন্য নির্দিষ্ট করা হয় তবে একটি ArithmeticExceptionনিক্ষেপ করা হয়। অন্যথায় বিভাগের সঠিক ফলাফলটি অন্য ক্রিয়াকলাপের মতোই ফিরে আসে।

ঠিক করার জন্য, আপনাকে এই জাতীয় কিছু করতে হবে :

a.divide(b, 2, RoundingMode.HALF_UP)

যেখানে 2 স্কেল এবং রাউন্ডিংমোড H HALF_UP রাউন্ডিং মোড

আরও তথ্যের জন্য এই ব্লগ পোস্ট দেখুন


3
এটি
যাস্পর

27
2 নয় precision; এটা scale। দয়া করে দস্তাবেজ.অরাকল.com
জন মানকো

(নতুন বিগডিসিমাল (100)) ভাগ করুন (নতুন বিগডিসিমাল (0.90), 2, রাউন্ডিংমড.এএএলএফ_ইউপি)
ইজেন

@ এনান্দে ওয়ার্কি ফিলিপস এটি স্কেল। জাভাদোক দেখুন । সম্পাদনা বাতিল হয়েছে।
মারকুইস

@ ব্যবহারকারী 207421, আমি দুর্ঘটনাক্রমে এটি সম্পাদনা করেছি এবং আবার ফিরে যাওয়ার চেষ্টা করেছি .. তবে কোনও সম্পাদনা মোছার মতো পর্যাপ্ত পয়েন্ট নেই .... meta.stackexchange.com/questions/80933/…
আনন্দ ফিলিপস

76

কারণ আপনি কোনও নির্ভুলতা এবং একটি বৃত্তাকার-মোড উল্লেখ করছেন না। বিগডিসিমাল অভিযোগ করছে যে এটি 10, 20, 5000 বা অনন্ত দশমিক জায়গা ব্যবহার করতে পারে এবং এটি এখনও আপনাকে সংখ্যার সঠিক প্রতিনিধিত্ব দিতে সক্ষম হবে না। সুতরাং আপনাকে একটি ভুল বিগডিসিমাল দেওয়ার পরিবর্তে, এটি আপনাকে দেখায়।

তবে আপনি যদি কোনও রাউন্ডিংমোড এবং যথার্থতা সরবরাহ করেন তবে এটি রূপান্তর করতে সক্ষম হবে (উদাঃ 1.333333333-থেকে-অনন্ততাকে ১.৩৩৩৩ এর মতো কিছুতে ... তবে প্রোগ্রামার হিসাবে আপনাকে এটি নির্দিষ্ট করতে হবে যে আপনি কী নির্ভুলতার সাথে খুশি হয়েছেন) '।



13

এই জাতীয় সমস্যা সমাধানের জন্য আমি নীচে কোড ব্যবহার করেছি

a.divide(b, 2, RoundingMode.HALF_EVEN)

2 যথার্থতা। এখন সমস্যা সমাধান করা হয়েছিল।


3
কোড ছাড়াও, কিছু ব্যাখ্যা প্রদান করা উচিত।
মার্টিন সেরানো 18

11
2 নয় precision; এটা scale। দয়া করে দস্তাবেজ.অরাকল.com
জন মানকো

3
রাউন্ডিংমড.এইচএলএফ_এভিএন আর্থিক অ্যাপ্লিকেশনগুলির জন্য প্রস্তাবিত। এটিই ব্যাঙ্কিংয়ে যা ব্যবহৃত হয়
ACV

যারা, যথার্থতার বিষয়ে জন মানকোসের মন্তব্যে বিভ্রান্ত হয়েছেন, দয়া করে এই উত্তরটি দেখুন stackoverflow.com/questions/4591206/…
স্টিম্পসন ক্যাট

5

আমার একই সমস্যা ছিল, কারণ আমার কোডের লাইনটি ছিল:

txtTotalInvoice.setText(var1.divide(var2).doubleValue() + "");

পূর্ববর্তী উত্তরটি পড়ে আমি এটিতে পরিবর্তন করেছি কারণ আমি দশমিক নির্ভুলতা লিখছিলাম না:

txtTotalInvoice.setText(var1.divide(var2,4, RoundingMode.HALF_UP).doubleValue() + "");

4 হ'ল ডেসিমাল প্রিসিসন

এবং রাউন্ডিংমড হ'ল এনাম ধ্রুবক, আপনি এগুলির মধ্যে যে কোনও একটি চয়ন করতে পারেন UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP

এই ক্ষেত্রে HALF_UP এর ফলাফল হবে:

2.4 = 2   
2.5 = 3   
2.7 = 3

আপনি না পরীক্ষা করতে RoundingModeএখানে তথ্য: http://www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/


4 স্কেল, নির্ভুলতা নয়।
মারকুইস


1

বিগডিসিমাল এর উত্তর গাণিতিক ধারণা গ্রহণ করে

public static void main(String[] args) {
        int age = 30;
        BigDecimal retireMentFund = new BigDecimal("10000.00");
        retireMentFund.setScale(2,BigDecimal.ROUND_HALF_UP);
        BigDecimal yearsInRetirement = new BigDecimal("20.00");
        String name = " Dennis";
        for ( int i = age; i <=65; i++){
            recalculate(retireMentFund,new BigDecimal("0.10"));
        }
        BigDecimal monthlyPension =   retireMentFund.divide(
                yearsInRetirement.divide(new BigDecimal("12"), new MathContext(2, RoundingMode.CEILING)), new MathContext(2, RoundingMode.CEILING));      
        System.out.println(name+ " will have £" + monthlyPension +" per month for retirement");
    }
public static void recalculate (BigDecimal fundAmount, BigDecimal rate){
        fundAmount.multiply(rate.add(new BigDecimal("1.00")));
    }

আপনার বিভাজন পদ্ধতি কলটিতে ম্যাথকনটেক্সট অবজেক্ট যুক্ত করুন এবং নির্ভুলতা এবং বৃত্তাকার মোড সামঞ্জস্য করুন। এটি আপনার সমস্যার সমাধান করা উচিত


0

দশমিক সংখ্যা ব্যবহার করার জন্য আপনার প্রোগ্রামটি কী সূক্ষ্মতা জানে না তাই এটি ছোঁড়ে:

java.lang.ArithmeticException: Non-terminating decimal expansion

ব্যতিক্রমকে বাইপাস করার সমাধান:

MathContext precision = new MathContext(int setPrecisionYouWant); // example 2
BigDecimal a = new BigDecimal("1.6",precision);
BigDecimal b = new BigDecimal("9.2",precision);
a.divide(b) // result = 0.17
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.