জাভাতে ডাবল দিয়ে নির্ভুলতা ধরে রাখুন


149
public class doublePrecision {
    public static void main(String[] args) {

        double total = 0;
        total += 5.6;
        total += 5.8;
        System.out.println(total);
    }
}

উপরের কোড মুদ্রণ:

11.399999999999

আমি কীভাবে এটি কেবল মুদ্রণ করতে (বা এটি হিসাবে ব্যবহার করতে সক্ষম হব) 11.4?


উত্তর:


151

অন্যরা যেমন উল্লেখ করেছে, আপনি সম্ভবত BigDecimalশ্রেণিটি ব্যবহার করতে চাইবেন, যদি আপনি ১১.৪ এর সঠিক প্রতিনিধিত্ব করতে চান।

এখন কেন এটি হচ্ছে তার একটি সামান্য ব্যাখ্যা:

floatএবং doubleজাভা আদিম ধরনের হয় বিন্দু ভাসমান সংখ্যা, যেখানে সংখ্যাকে ভগ্নাংশ এবং এক্সপোনেন্ট একটি বাইনারি প্রতিনিধিত্ব হিসাবে সংরক্ষিত হয়।

আরও সুনির্দিষ্টভাবে, ডাবল-স্পষ্টতা ভাসমান পয়েন্টের মান যেমন doubleটাইপটি একটি 64৪-বিট মান, যেখানে:

  • 1 বিট চিহ্নটিকে (ধনাত্মক বা negativeণাত্মক) নির্দেশ করে।
  • ঘাতক জন্য 11 বিট।
  • উল্লেখযোগ্য সংখ্যাগুলির জন্য 52 বিট (বাইনারি হিসাবে ভগ্নাংশ)

এই অংশগুলি একত্রিত doubleহয়ে একটি মান উপস্থাপন করে।

(সূত্র: উইকিপিডিয়া: দ্বিগুণ নির্ভুলতা )

জাভাতে কীভাবে ভাসমান পয়েন্টের মানগুলি পরিচালনা করা হয় তার বিশদ বিবরণের জন্য বিভাগ 4.2.3 দেখুন: জাভা ভাষা নির্দিষ্টকরণের ভাসমান-পয়েন্টের ধরণ, বিন্যাস এবং মানগুলি

byte, char, int, longধরনের হয় নির্দিষ্ট বিন্দু সংখ্যা, যা সংখ্যার সঠিক representions হয়। স্থির পয়েন্ট সংখ্যাগুলির বিপরীতে, ভাসমান পয়েন্ট সংখ্যাগুলি কিছু সময় ("বেশিরভাগ সময়" ধরে নেওয়া নিরাপদ) কোনও সংখ্যার যথাযথ উপস্থাপনা ফেরত দিতে সক্ষম হবে না। এই কারণে আপনি 11.399999999999ফলাফল হিসাবে শেষ 5.6 + 5.8

1.5 বা 150.1005 এর মতো নির্ভুল মানের প্রয়োজন হলে, আপনি নির্দিষ্ট পয়েন্টের ধরণের একটি ব্যবহার করতে চাইবেন, যা সংখ্যাকে ঠিক উপস্থাপন করতে সক্ষম হবে।

যেমন ইতিমধ্যে বেশ কয়েকবার উল্লেখ করা হয়েছে, জাভাতে একটি BigDecimalক্লাস রয়েছে যা খুব বড় সংখ্যক এবং খুব কম সংখ্যক হ্যান্ডেল করবে।

BigDecimalশ্রেণীর জন্য জাভা এপিআই রেফারেন্স থেকে :

অপরিবর্তনীয়, নির্বিচারে-নির্ভুলতা স্বাক্ষরিত দশমিক সংখ্যা imal একটি বিগডিসিমাল একটি স্বেচ্ছাসেবী যথার্থ পূর্ণসংখ্যার আনসেকেড মান এবং একটি 32-বিট পূর্ণসংখ্যার স্কেল নিয়ে গঠিত। যদি শূন্য বা ধনাত্মক হয় তবে স্কেল হ'ল দশমিক বিন্দুর ডানদিকে সংখ্যাগুলির সংখ্যা। যদি negativeণাত্মক হয় তবে সংখ্যাটির আনসেল্ড মানকে দশ দ্বারা গুণিত করে স্কেলকে অস্বীকার করার শক্তি দেওয়া হবে। বিগডিসিমাল দ্বারা প্রতিনিধিত্ব করা সংখ্যার মান তাই (আনসকেডভ্যালু × 10 ^ -স্কেল)।

ভাসমান পয়েন্ট সংখ্যা এবং তার যথার্থতা সম্পর্কিত স্ট্যাক ওভারফ্লোতে অনেক প্রশ্ন রয়েছে। এখানে আগ্রহী হতে পারে সম্পর্কিত প্রশ্নগুলির একটি তালিকা:

আপনি যদি ভাসমান পয়েন্ট সংখ্যাগুলির সত্যিকারের কৌতুকপূর্ণ বিবরণে নামতে চান, তবে প্রতিটি কম্পিউটার বিজ্ঞানী কী ভাসমান-পয়েন্ট গাণিতিক সম্পর্কে জানতে হবে তা একবার দেখুন ।


3
প্রকৃতপক্ষে, সাধারণত 53 টি উল্লেখযোগ্য বিট থাকে কারণ "দশমিক" পয়েন্টের আগে 1টি অস্বীকৃত মানগুলি ব্যতীত অন্য সকলের জন্য বোঝানো হয়, একটি অতিরিক্ত বিট স্পষ্টতা দেয়। উদাহরণস্বরূপ 3 টি (1.) 1000 হিসাবে সংরক্ষণ করা হয় ... x 2 ^ 1 যখন 0.5 হিসাবে সংরক্ষণ করা হয় (1) 0000 ... x 2 ^ -1 মানটি যখন অস্বীকৃত হয় (সমস্ত খণ্ড বিট শূন্য থাকে) সেখানে থাকতে পারে, এবং সাধারণত, কম উল্লেখযোগ্য অঙ্কগুলি হবে যেমন 1 x 2 10 -1030 (0) 00000001 x 2 ^ -1022 হিসাবে সঞ্চিত রয়েছে সুতরাং সাতটি উল্লেখযোগ্য অঙ্ক স্কেল হিসাবে বলি দেওয়া হয়েছে।
সারা ফিলিপস

1
এটি লক্ষ করা উচিত যে এই ক্ষেত্রেটির BigDecimalতুলনায় এটি খুব ধীরে ধীরে হলেও doubleডাবলটির যথাযথ 15 দশমিক স্থান রয়েছে, আপনার কেবল গোলাকার প্রয়োজন।
পিটার লরি

2
@ পিটারলাউরে এর দশমিক দশমিক সংখ্যা রয়েছে যথাক্রমে যদি সেগুলি দশমিক বিন্দুর আগে হয়। দশমিক বিন্দুর পরে কিছুই ঘটতে পারে, কারণ দশমিক এবং বাইনারি ভগ্নাংশের অসম্পূর্ণতা u
লার্নের মারকুইস

@ এজেপি আপনি ঠিক বলেছেন, এটির প্রায় 15 টি উল্লেখযোগ্য অঙ্ক রয়েছে। এটি 16 টি হতে পারে তবে এটি 15 বা সম্ভবত 14 বলে ধরে নেওয়া নিরাপদ
পিটার লরি

@ পিটারলাউরে ইজেপির সংশোধনটি আমার প্রশ্নের কারণে হয়েছিল: স্ট্যাকওভারফ্লো / প্রশ্ন / 63৩63৪7575৫৮/২ আপনি দয়া করে কেন এটি সঠিকভাবে 15 নন এবং কোন পরিস্থিতিতে 16 বা 14 হতে পারে সে সম্পর্কে প্রসারিত করতে পারেন?
শিবম সিনহা

103

উদাহরণস্বরূপ, আপনি যখন একটি ডাবল সংখ্যার ইনপুট করেন, তখন আপনি 33.33333333333333যে মূল্য পান সেটি হ'ল নিকটতম প্রতিনিধিত্বযোগ্য ডাবল-স্পষ্টতা মান, যা হ'ল:

33.3333333333333285963817615993320941925048828125

১০০ দিয়ে ভাগ করা:

0.333333333333333285963817615993320941925048828125

যা ডাবল-স্পষ্টতা সংখ্যার হিসাবেও উপস্থাপনযোগ্য নয়, তাই এটি আবার নিকটতম উপস্থাপনযোগ্য মান হিসাবে গোল হয়, যা হুবহু:

0.3333333333333332593184650249895639717578887939453125

আপনি যখন এই মানটি মুদ্রণ করেন, এটি আবার 17 টি দশমিক সংখ্যায় গোল হয়ে যায়:

0.33333333333333326

114
যে কেউ ভবিষ্যতে এটি পড়ছে এবং এই প্রশ্নের উত্তরটির সাথে কেন কোনও সম্পর্ক নেই তা নিয়ে আশ্চর্য হয়ে পড়েছেন: কিছু মডারেটর এই প্রশ্নের পরিবর্তে আমি (এবং অন্যরা) যে প্রশ্নের উত্তর দিয়েছিলাম তা একীভূত করার সিদ্ধান্ত নিয়েছে, বরং ভিন্ন, প্রশ্নটি।
স্টিফেন ক্যানন

আপনি কিভাবে সঠিক দ্বিগুণ মান জানেন?
মাইকেল ইয়াওওয়ারস্কি

@mikeyaworski en.wikipedia.org/wiki/Double-precision_floating-point_format দেখুন ডবল স্পষ্টতা উদাহরণ
Jaydee

23

আপনি যদি মানগুলি কেবল ভগ্নাংশ হিসাবে প্রক্রিয়া করতে চান তবে আপনি একটি ভগ্নাংশ বর্গ তৈরি করতে পারেন যা একটি সংখ্যার এবং ডিনোমিনেটর ক্ষেত্র ধারণ করে।

একটি টুবল পদ্ধতি পাশাপাশি অ্যাড, বিয়োগ, গুণ এবং ভাগ করার জন্য পদ্ধতি লিখুন। এইভাবে আপনি গণনার সময় ভাসমান এড়াতে পারবেন।

সম্পাদনা: দ্রুত বাস্তবায়ন,

public class Fraction {

private int numerator;
private int denominator;

public Fraction(int n, int d){
    numerator = n;
    denominator = d;
}

public double toDouble(){
    return ((double)numerator)/((double)denominator);
}


public static Fraction add(Fraction a, Fraction b){
    if(a.denominator != b.denominator){
        double aTop = b.denominator * a.numerator;
        double bTop = a.denominator * b.numerator;
        return new Fraction(aTop + bTop, a.denominator * b.denominator);
    }
    else{
        return new Fraction(a.numerator + b.numerator, a.denominator);
    }
}

public static Fraction divide(Fraction a, Fraction b){
    return new Fraction(a.numerator * b.denominator, a.denominator * b.numerator);
}

public static Fraction multiply(Fraction a, Fraction b){
    return new Fraction(a.numerator * b.numerator, a.denominator * b.denominator);
}

public static Fraction subtract(Fraction a, Fraction b){
    if(a.denominator != b.denominator){
        double aTop = b.denominator * a.numerator;
        double bTop = a.denominator * b.numerator;
        return new Fraction(aTop-bTop, a.denominator*b.denominator);
    }
    else{
        return new Fraction(a.numerator - b.numerator, a.denominator);
    }
}

}

1
অবশ্যই numeratorএবং এস করা denominatorউচিত int? আপনি কেন ভাসমান-পয়েন্ট যথার্থতা চান?
সমীর তালওয়ার

অনুমান করুন এটি সত্যই প্রয়োজনীয় নয় তবে কোডড আরও ভালভাবে পড়তে পারে তাই এটি টুড ফাংশনে কাস্টিং এড়ায়।
ভাইরাল শাহ

5
ভাইরালশাহ: এটি গাণিতিক ক্রিয়াকলাপগুলি পরিচালনা করার সময় ভাসমান-পয়েন্ট ত্রুটিটিও সম্ভাব্যভাবে প্রবর্তন করে। এই অনুশীলনের মূল বিষয়টি হ'ল এটি এড়ানো, এটি পরিবর্তন করা বুদ্ধিমান বলে মনে হয়।
সমীর তালওয়ার

উপরে সমীর তালওয়ারের উল্লিখিত কারণে ডাবলসের পরিবর্তে ইনট ব্যবহার করতে সম্পাদিত।
ভাইরাল শাহ

3
ভগ্নাংশের এই বাস্তবায়নে সমস্যা রয়েছে কারণ এটি এগুলিকে একটি সরল আকারে হ্রাস করে না। 2/3 * 1/2 2/6 দিন যেখানে আপনি সত্যই উত্তরটি 1/3 করতে চান। আদর্শভাবে কন্সট্রাক্টরে আপনি অঙ্ক এবং বিভাজকের জিসিডি সন্ধান করতে এবং এটি দ্বারা উভয়কে ভাগ করতে চান।
সালিক্স আলবা

15

লক্ষ্য করুন যে আপনি যদি সীমাবদ্ধ-নির্ভুলতা দশমিক গাণিতিক ব্যবহার করেন এবং 1/3: 0.333333333 * 3 এর সাথে ডিল করতে চান তবে আপনার একই সমস্যা হবে 1.00000000 নয়।

দুর্ভাগ্যক্রমে, 5.6, 5.8 এবং 11.4 কেবল বাইনারিগুলিতে গোলাকার সংখ্যা নয়, কারণ এতে পঞ্চাশ ভাগ রয়েছে। সুতরাং তাদের মধ্যে ভাসমান উপস্থাপনা সঠিক নয় ঠিক যেমন 0.3.33 ঠিক 1/3 নয়।

যদি আপনি ব্যবহার করেন এমন সমস্ত নম্বর যদি পুনরাবৃত্তি না হওয়া দশমিক হয় এবং আপনি সঠিক ফলাফল চান তবে বিগডিসিমাল ব্যবহার করুন। বা অন্যরা যেমন বলেছে, আপনার মানগুলি যদি অর্থের মতো হয় যে সেগুলি সমস্ত 0.01 বা 0.001 বা অন্য কোনও কিছু, তবে 10 এর একটি নির্দিষ্ট শক্তির দ্বারা সবকিছুকে গুণিত করুন এবং ইনট বা দীর্ঘ ব্যবহার করুন (সংযোজন এবং বিয়োগফলটি হ'ল) তুচ্ছ: গুণের জন্য নজর রাখুন)।

তবে, আপনি যদি গণনার জন্য বাইনারি নিয়ে খুশি হন তবে আপনি কিছুটা বন্ধুত্বপূর্ণ বিন্যাসে জিনিসগুলি মুদ্রণ করতে চান, চেষ্টা করুন java.util.Formatterবা String.format। ফর্ম্যাট স্ট্রিংয়ে একটি ডাবল পূর্ণ নির্ভুলতার চেয়ে কম নির্ভুলতা নির্দিষ্ট করে। 10 টি উল্লেখযোগ্য পরিসংখ্যান থেকে, বলুন, 11.399999999999 11.4, সুতরাং বাইনারি ফলাফল কেবলমাত্র কয়েকটি দশমিক স্থানের জন্য প্রয়োজনীয় একটি মানের খুব কাছাকাছি যেখানে ক্ষেত্রে প্রায় সঠিক এবং আরও বেশি মানব-পঠনযোগ্য হবে able

নির্দিষ্ট করার জন্য নির্ভুলতা আপনার সংখ্যাগুলির সাথে আপনি কতগুলি গণিত করেছেন তার উপর কিছুটা নির্ভর করে - সাধারণভাবে আপনি যত বেশি করেন তত ত্রুটি জমে উঠবে, তবে কিছু অ্যালগোরিদম এটি অন্যদের তুলনায় খুব দ্রুত জমে থাকে (এগুলিকে "অস্থির" বলা হয়) রাউন্ডিং ত্রুটির বিষয়ে "স্থিতিশীল" এর বিরোধিতা)। যদি আপনি যা কিছু করছেন কিছু মান যুক্ত হচ্ছে, তবে আমি অনুমান করতে পারি যে নির্ভুলতার মাত্র এক দশমিক স্থান বাদ দিয়ে জিনিসগুলি সাজানো হবে। পরীক্ষা।


3
না, আর্থিক মান সহ ডাবল ব্যবহার করবেন না ! অর্থের সাথে আপনার নির্ভুলতা প্রয়োজন, পরিবর্তে বিগডিসিমাল ব্যবহার করুন। অন্যথায়, আপনার উত্তর ভাল। আপনার যে কোনও জিনিসের সাথে নির্ভুলতার প্রয়োজন হয়, বিগডিসিমাল ব্যবহার করুন, যদি যথার্থতাটি গুরুত্বপূর্ণ না হয় তবে আপনি ভাসা বা ডাবল ব্যবহার করতে পারেন।
MetroidFan2002

1
প্রশ্নটি আর অর্থের সাথে জড়িত বলে বা বোঝায় না। আমি বিশেষত অর্থের জন্য বিগডিসিমাল বা পূর্ণসংখ্যা ব্যবহার করতে বলি। সমস্যা কি?
স্টিভ জেসোপ

1
এবং "টাকার জন্য ডাবল ব্যবহার করবেন না" এর সমান "বিগডিসিমাল বা তৃতীয়াংশের জন্য দ্বিগুণ ব্যবহার করবেন না "। তবে কখনও কখনও কোনও সমস্যা বিভাগের সাথে জড়িত থাকে, যেখানে সমস্ত ডিনোমিনেটরগুলির সমস্ত মৌলিক কারণগুলির দ্বারা বিভাজ্য নয় সমস্ত ক্ষেত্রে সমানভাবে খারাপ।
স্টিভ জেসোপ

1
.9999 = 1 যদি আপনার যথার্থতা 4 টিরও কম গুরুত্বপূর্ণ সংখ্যার চেয়ে কম হয়
ব্রায়ান লেহে

9

আপনি যদি জাভা জাভা.ম্যাথ.বিগডিসিমাল ক্লাসটি ব্যবহার করতে চান তবে যদি আপনার সত্যিকারের নির্ভুল গণিতের প্রয়োজন হয়। এখানে বিগডিসিমালের ক্ষেত্রে ওরাকল / সান থেকে একটি ভাল নিবন্ধ দেওয়া হয়েছে । আপনি 1/3 কখনও প্রতিনিধিত্ব করতে পারেন যদিও যেমন কেউ উল্লেখ করা হয়েছে, আপনি করতে পারেন সিদ্ধান্ত নিতে ঠিক কিভাবে সুনির্দিষ্ট আপনি ফলাফলের হতে চান ক্ষমতা আছে। সেটস্কেল () আপনার বন্ধু .. :)

ঠিক আছে, কারণ এই মুহুর্তে আমার হাতে অনেক বেশি সময় রয়েছে এমন একটি কোড উদাহরণ যা আপনার প্রশ্নের সাথে সম্পর্কিত:

import java.math.BigDecimal;
/**
 * Created by a wonderful programmer known as:
 * Vincent Stoessel
 * xaymaca@gmail.com
 * on Mar 17, 2010 at  11:05:16 PM
 */
public class BigUp {

    public static void main(String[] args) {
        BigDecimal first, second, result ;
        first = new BigDecimal("33.33333333333333")  ;
        second = new BigDecimal("100") ;
        result = first.divide(second);
        System.out.println("result is " + result);
       //will print : result is 0.3333333333333333


    }
}

এবং আমার নতুন পছন্দের ভাষা গ্রোভিকে প্লাগ করতে এখানে একই জিনিসটির একটি সুস্পষ্ট উদাহরণ রয়েছে:

import java.math.BigDecimal

def  first =   new BigDecimal("33.33333333333333")
def second = new BigDecimal("100")


println "result is " + first/second   // will print: result is 0.33333333333333

5

খুব নিশ্চিত যে আপনি এটি একটি তিন লাইনের উদাহরণ তৈরি করতে পারতেন। :)

আপনি যদি যথার্থ নির্ভুলতা চান তবে বিগডিসিমাল ব্যবহার করুন। অন্যথায়, আপনি 10 দ্বারা গুণিত ইনটগুলি ব্যবহার করতে পারেন ^ যা নির্ভুলতা চান।


5

অন্যরা যেমন উল্লেখ করেছে, দশমিক দশকের মানগুলি বাইনারি হিসাবে প্রতিনিধিত্ব করা যায় না, যেহেতু দশমিক 10 এর ক্ষমতার উপর ভিত্তি করে এবং বাইনারি দুটির শক্তির উপর নির্ভর করে।

যদি নির্ভুলতা গুরুত্বপূর্ণ হয় তবে বিগডিসিমাল ব্যবহার করুন, তবে আপনি যদি কেবল বন্ধুত্বপূর্ণ আউটপুট চান:

System.out.printf("%.2f\n", total);

তোমাকে দিবে:

11.40

5

আপনি দ্বিগুণ টাইপের নির্ভুলতার সীমাবদ্ধতার বিরুদ্ধে চলেছেন।

জাভা.ম্যাথে কিছু স্বেচ্ছাচারিতা-নির্ভুলতা পাটিগণিত সুবিধা রয়েছে।


... যেমন java.math প্যাকেজ। java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html
ম্যাথু

5

আপনি পারবেন না, কারণ বাইনারি 7.3 এর সীমাবদ্ধ প্রতিনিধিত্ব নেই। নিকটতম আপনি পেতে পারেন 2054767329987789/2 ** 48 = 7.3 + 1/1407374883553280।

আরও ব্যাখ্যার জন্য http://docs.python.org/tutorial/floatingPoint.html দেখুন । (এটি পাইথন ওয়েবসাইটে রয়েছে, তবে জাভা এবং সি ++ এর একই "সমস্যা" রয়েছে))

সমাধানটি আপনার সমস্যাটি ঠিক কীটির উপর নির্ভর করে:

  • যদি আপনি কেবল এই সমস্ত গোলমাল সংখ্যা দেখতে পছন্দ করেন না তবে আপনার স্ট্রিং বিন্যাসটি ঠিক করুন। 15 টির বেশি উল্লেখযোগ্য সংখ্যা (বা ভাসমানের জন্য 7) প্রদর্শিত করবেন না।
  • যদি এটি হয় যে আপনার সংখ্যার অক্ষমতা "যদি" স্টেটমেন্টের মতো জিনিসগুলি ভঙ্গ করছে, তবে আপনার যদি লিখতে হবে (অ্যাবস (এক্স - 7.3) <টোলারেন্স) এর পরিবর্তে যদি (x == 7.3) থাকে।
  • আপনি যদি অর্থ নিয়ে কাজ করছেন, তবে আপনি সম্ভবত যা চান তা হ'ল দশমিক নির্দিষ্ট পয়েন্ট। কোনও পূর্ণসংখ্যার সেন্ট বা আপনার মুদ্রার ক্ষুদ্রতম ইউনিট যাই হোক না কেন তা সঞ্চয় করুন।
  • (খুব আশ্চর্যজনক) আপনার যদি যথার্থতার জন্য 53 টিরও বেশি তাত্পর্যপূর্ণ বিট (15-16 উল্লেখযোগ্য সংখ্যা) প্রয়োজন হয় তবে বিগডেসিমালের মতো একটি উচ্চ-নির্ভুলতা ভাসমান-বিন্দুর ধরণটি ব্যবহার করুন।

বাইনারিতে .3.৩ এর সীমাবদ্ধ প্রতিনিধিত্ব নাও থাকতে পারে তবে আমি নিশ্চিত যে আমি সি ++ তে একই জিনিসটি চেষ্টা করার পরে -7.৩ পেয়ে যাব
ভুল ব্যবহারকারীর নাম

2
ভুল ব্যবহারকারীর নাম: না, আপনি করবেন না। এটি কেবল সেভাবে প্রদর্শিত হয়। আসল উত্তরটি দেখতে "% .17g" ফর্ম্যাটটি (বা আরও ভাল, "% .51g") ব্যবহার করুন।
dan04

4
private void getRound() {
    // this is very simple and interesting 
    double a = 5, b = 3, c;
    c = a / b;
    System.out.println(" round  val is " + c);

    //  round  val is  :  1.6666666666666667
    // if you want to only two precision point with double we 
            //  can use formate option in String 
           // which takes 2 parameters one is formte specifier which 
           // shows dicimal places another double value 
    String s = String.format("%.2f", c);
    double val = Double.parseDouble(s);
    System.out.println(" val is :" + val);
    // now out put will be : val is :1.67
}

3

Java.math.BigDecimal ব্যবহার করুন

দ্বিগুণ অভ্যন্তরীণভাবে বাইনারি ভগ্নাংশ হয়, তাই তারা কখনও কখনও সঠিক দশমিকের দশমিক ভগ্নাংশ উপস্থাপন করতে পারে না।


1
অন্ধভাবে বিগডিসিমাল সুপারিশ করার জন্য -1। আপনার যদি আসলে দশমিক গাণিতিক প্রয়োজন না হয় (অর্থাত্ যদি আপনি অর্থ দিয়ে গণনা করছেন) তবে বিগডিসিমাল আপনাকে সাহায্য করবে না। এটি আপনার ভাসমান-পয়েন্টের সমস্ত ত্রুটি সমাধান করে না: আপনাকে এখনও 1/3 * 3 = 0.9999999999999999999999999999 এবং স্কয়ার্ট (2) ** 2 = 1.999999999999999999999999999 এর সাথে ডিল করতে হবে। তদুপরি, বিগডিসিমাল একটি বিশাল গতির পেনাল্টি বহন করে। আরও খারাপ, জাভার অপারেটর ওভারলোডিংয়ের অভাবের কারণে আপনাকে আপনার সমস্ত কোড পুনর্লিখন করতে হবে।
dan04

2
@ ডান04 - আপনি যদি অর্থ দিয়ে হিসাব করেন তবে এর মধ্যে অন্তর্নিহিত ত্রুটিটি জেনে কেন ভাসমান উপস্থাপনা ব্যবহার করুন .... যেহেতু সেন্টের কোনও ভগ্নাংশ নেই আপনি আনুমানিক ডলার ব্যবহারের পরিবর্তে দশমিক এবং সেন্ট গণনা করতে পারেন আপনার সঠিক পরিমাণের পরিমাণ cent আপনি যদি সত্যিই চান শতকের ভগ্নাংশটি এএ লম্বা ব্যবহার করে এবং কয়েক হাজার সেন্ট গণনা করুন। আরও আরও ওপি যুক্তিযুক্ত সংখ্যা সম্পর্কে কোনও উল্লেখ করেনি, তিনি উদ্বিগ্ন সমস্তই। উত্তরটি দেওয়ার আগে পোস্টটি মনোযোগ সহকারে পড়ুন এবং সমস্যাটি বুঝতে পারেন, আপনাকে কিছুটা বিব্রতকরতা বাঁচাতে পারে।
নিউটোপিয়ান

3
@ নিউটোপিয়ান: আমার বিব্রত হওয়ার মতো কিছুই নেই। ওপি অর্থের বিষয়ে কোনও উল্লেখ করেনি, বা তার সমস্যার কোনও অন্তর্নিহিত দশমিকতা রয়েছে এমন কোনও ইঙ্গিতও দেয়নি।
dan04

@ ডান04 - কোনও ওপি দেয় নি ... আপনি অন্ধভাবেই প্রাসঙ্গিক মতামতের বাইরে এমন প্রস্তাব দিয়েছিলেন যে সম্ভবত সঠিকভাবে গ্রহণযোগ্য উত্তরটি দেওয়া হয়েছে বিশদ বিবরণের পরিমান অনুযায়ী
নিউটোপিয়ান

2

সবকিছুকে 100 দ্বারা গুণিত করুন এবং এটি সেন্ট হিসাবে দীর্ঘস্থলে সংরক্ষণ করুন।


2
@ ড্রেমন - শেষ সম্পাদনার আগে পোস্টটি দেখুন - সমস্ত "শপিংটোটাল" এবং "ক্যালকজিএসটি" এবং "ক্যালকপিএসটি" সামগ্রী আমার কাছে টাকার মতো দেখাচ্ছে।
পল টমবলিন 21

2

কম্পিউটারগুলি বাইনারিগুলিতে সংখ্যা সঞ্চয় করে এবং প্রকৃতপক্ষে 33.333333333 বা 100.0 এর মতো সংখ্যার প্রতিনিধিত্ব করতে পারে না। ডাবল ব্যবহারের ক্ষেত্রে এটি অন্যতম কৌশল। কোনও ব্যবহারকারীর কাছে এটি দেখানোর আগে আপনাকে কেবল উত্তরটি গোল করতে হবে। ভাগ্যক্রমে বেশিরভাগ অ্যাপ্লিকেশনগুলিতে আপনার কোনও রকমের দশমিক স্থানের দরকার নেই।


আমি সম্ভাব্য সর্বোচ্চ নির্ভুলতা পছন্দ করতে পছন্দ করব কিছু প্রতিকূল গণনা করছি। তবে আমি বুঝতে পারি এর সীমাবদ্ধতা রয়েছে
অলি

2

ভাসমান পয়েন্ট সংখ্যাগুলি যে কোনও প্রদত্ত ভাসমান পয়েন্ট সংখ্যাটির জন্য প্রকৃত সংখ্যা থেকে পৃথক হয় পরবর্তী উচ্চতর ভাসমান পয়েন্ট সংখ্যা থাকে। পূর্ণসংখ্যা হিসাবে একই। 1 এবং 2 এর মধ্যে কোনও পূর্ণসংখ্যা নেই।

ভাসমান হিসাবে 1/3 উপস্থাপন করার কোনও উপায় নেই। এটির নীচে একটি ভাসমান রয়েছে এবং এটির উপরে একটি ভাসমান রয়েছে এবং তাদের মধ্যে একটি নির্দিষ্ট দূরত্ব রয়েছে। এবং 1/3 হয় সেই স্থানটিতে।

জাভার পক্ষে অ্যাপল ফ্ল্যাট দাবি করে যে স্বেচ্ছাসেবী নির্ভুল ভাসমান পয়েন্ট সংখ্যাগুলি নিয়ে কাজ করে, তবে আমি এটি কখনও ব্যবহার করি নি। সম্ভবত এক নজর মূল্যবান। http://www.apfloat.org/apfloat_java/

জাভা ফ্লোটিং পয়েন্ট উচ্চ নির্ভুলতা গ্রন্থাগারের আগে এখানে অনুরূপ প্রশ্ন জিজ্ঞাসা করা হয়েছিল


1

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

জাভার নিকটতম বাইনারি আনুমানিক উত্পাদন করছে। আপনি আরও ভাল দেখায় দশমিক মান প্রদর্শন করতে java.text.Decimal Format ব্যবহার করতে পারেন।


1

একটি বিগডিসিমাল ব্যবহার করুন। এটি আপনাকে রাউন্ডিং বিধিগুলিও নির্দিষ্ট করতে দেয় (যেমন রাউউএইচএলএইচএলএইচএলএইচএইচএনএভিএন, যা উভয়ই একই দূরত্বে থাকলেও প্রতিবেশীর কাছে গোল করে পরিসংখ্যানগত ত্রুটি হ্রাস করবে; অর্থাত্ 1.5 এবং 2.5 থেকে 2) both


1

সংক্ষিপ্ত উত্তর: সর্বদা বিগডিসিমাল ব্যবহার করুন এবং নিশ্চিত করুন যে আপনি স্ট্রিং আর্গুমেন্ট দিয়ে কনস্ট্রাক্টর ব্যবহার করছেন, দ্বিগুণ নয়।

আপনার উদাহরণে ফিরে যান, নীচের কোডটি আপনার ইচ্ছামতো 11.4 মুদ্রণ করবে।

public class doublePrecision {
    public static void main(String[] args) {
      BigDecimal total = new BigDecimal("0");
      total = total.add(new BigDecimal("5.6"));
      total = total.add(new BigDecimal("5.8"));
      System.out.println(total);
    }
}

0

বিগডিসিমাল দেখুন, এটি ভাসমান পয়েন্ট গণিতের মতো সমস্যাগুলি পরিচালনা করে।

নতুন কলটি দেখতে এমন হবে:

term[number].coefficient.add(co);

দশমিক স্থান ব্যবহারের জন্য নির্ভুলতার সংখ্যা নির্ধারণ করতে সেটস্কেল () ব্যবহার করুন।


0

ম্যাথ ক্লাস থেকে গোল () পদ্ধতিটি ব্যবহার করবেন না কেন?

// The number of 0s determines how many digits you want after the floating point
// (here one digit)
total = (double)Math.round(total * 10) / 10;
System.out.println(total); // prints 11.4

0

আপনার যদি ডাবল ভ্যালু ব্যবহার করা ছাড়া অন্য কোনও উপায় না থাকে তবে নীচের কোডটি ব্যবহার করতে পারেন।

public static double sumDouble(double value1, double value2) {
    double sum = 0.0;
    String value1Str = Double.toString(value1);
    int decimalIndex = value1Str.indexOf(".");
    int value1Precision = 0;
    if (decimalIndex != -1) {
        value1Precision = (value1Str.length() - 1) - decimalIndex;
    }

    String value2Str = Double.toString(value2);
    decimalIndex = value2Str.indexOf(".");
    int value2Precision = 0;
    if (decimalIndex != -1) {
        value2Precision = (value2Str.length() - 1) - decimalIndex;
    }

    int maxPrecision = value1Precision > value2Precision ? value1Precision : value2Precision;
    sum = value1 + value2;
    String s = String.format("%." + maxPrecision + "f", sum);
    sum = Double.parseDouble(s);
    return sum;
}

-1

বিগডিসিমাল ব্যবহার করে আপনার এফর্ডটি অপচয় করবেন না। 99.99999% ক্ষেত্রে আপনার এটির দরকার নেই। জাভা ডাবল টাইপটি প্রায় উত্স অনুসারে হয় তবে প্রায় সব ক্ষেত্রেই এটি যথেষ্ট সঠিক prec মনে রাখবেন যে আপনার 14 তম উল্লেখযোগ্য অঙ্কে ত্রুটি রয়েছে। আসলেই তা নগণ্য!

সুন্দর আউটপুট ব্যবহার পেতে:

System.out.printf("%.2f\n", total);

2
আমি মনে করি তিনি আউটপুট দ্বারা চিন্তিত, সংখ্যার যথার্থতা দ্বারা নয়। এবং বিগডিসিমাল কোনও সহায়ক হবে না যদি আপনি উদাঃ। তিন দ্বারা বিভক্ত। এটি পরিস্থিতি আরও খারাপ করে দিতে পারে ...
ম্যাকিক ডি

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