বিগডিসিমাল সমান () বনাম তুলনা করুন ()


157

সাধারণ পরীক্ষার শ্রেণি বিবেচনা করুন:

import java.math.BigDecimal;

/**
 * @author The Elite Gentleman
 *
 */
public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BigDecimal x = new BigDecimal("1");
        BigDecimal y = new BigDecimal("1.00");
        System.out.println(x.equals(y));
        System.out.println(x.compareTo(y) == 0 ? "true": "false");
    }

}

আপনি (সচেতনভাবে) বলতে পারবেন যে xএটি সমান y(অবজেক্ট রেফারেন্স নয়) তবে আপনি যখন প্রোগ্রামটি চালাবেন, নিম্নলিখিত ফলাফলটি দেখায়:

false
true

প্রশ্ন: এর মধ্যে পার্থক্য কী compareTo()এবং equals()এটি BigDecimalযে সমান তা compareToনির্ধারণ করতে xপারে y?

পিএস: আমি দেখতে পাচ্ছি যে বিগডিসিমালের inflate()পদ্ধতিতে একটি পদ্ধতি রয়েছে equals()inflate()আসলে কি করে ?


1
বিজ্ঞাপন inflate(): এটি সর্বজনীন API এর অংশ নয় কারণ এটি কেবল অভ্যন্তরীণ উপস্থাপনাকে ম্যানিপুলেট করে এবং "বাইরের" তে কোনও দৃশ্যমান প্রভাব রাখে না। সুতরাং যদি না আপনি সত্যিই BigDecimalগভীরতার বাস্তবায়ন অধ্যয়ন করতে চান তবে আমি আপনাকে এই পদ্ধতিটি উপেক্ষা করার পরামর্শ দিই।
জোচিম সউর

একটি সংক্ষিপ্ত ব্যাখ্যা এবং উত্স কোড স্নিপেটগুলি এখানে
xenteros

উত্তর:


224

উত্তরটি পদ্ধতিটির জাভাডকে রয়েছেequals() :

বিপরীতে compareTo, এই পদ্ধতিটি BigDecimalকেবল দুটি মানকেই সমান হিসাবে বিবেচনা করে যদি তারা মান এবং স্কেলের সমান হয় (সুতরাং এই পদ্ধতিটির সাথে তুলনা করার সময় 2.0 ২.০০ এর সমান নয়)।

অন্য কথায়: প্রতিটি দিক equals()থেকে BigDecimalবস্তুগুলি ঠিক একই রকম কিনা তা পরীক্ষা করে দেখুনcompareTo()"কেবল" তাদের সংখ্যার মানটির সাথে তুলনা করে।

হিসেবে কেন equals() এই ভাবে আচরণ করবে, এই উত্তর দেওয়া হয়েছে এই তাই প্রশ্নে


24
BigDecimalআপনি জাভডোকটি সাবধানে না পড়লে এটির একটি খুব জটিল অংশ । :) - পার্থক্যটি উপলব্ধি না করা পর্যন্ত আমরা এগুলি থেকে কিছু অদ্ভুত বাগ পেয়েছি।
টমাস

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

7
হাস্যকর. আপনার উত্তরটি পড়ার পরে আমি কেবল তুলনামূলক পরীক্ষা করেছি এবং এতে বলা হয়েছে যে সমতার সাথে ধারাবাহিকতা
রাখার জন্য

4
: আমি কেন জিজ্ঞাসা করেছি stackoverflow.com/questions/14102083/...
bacar

8
@ স্টেফেনসি আমি মনে করি যে এটি অসম্পূর্ণতা বিদ্যমান তা ভুল
ম্যাট আর

1

আমি দেখতে পাচ্ছি যে বিগডিসিমেলের সমান () পদ্ধতিতে একটি স্ফীত () পদ্ধতি রয়েছে। ফুলে () আসলে কি করে?

মূলত, যদি প্রয়োজন হয় inflate()কল করে BigInteger.valueOf(intCompact), অর্থাত এটি একটি অনাবৃত মান তৈরি করে যা একটি হিসাবে সংরক্ষণ করা BigIntegerহয় long intCompact। আপনার যদি BigIntegerএটির প্রয়োজন না হয় এবং অবরুদ্ধ মানটি long BigDecimalমনে হয় তবে যতক্ষণ সম্ভব জায়গা সাশ্রয় করার চেষ্টা করা উচিত।


আপনি কী লিখেছেন (বিশেষত শেষ বাক্যটি সহ) আমার কোনও ধারণা নেই।
বুহাকে সিন্ধি

@ দ্য এলিট BigDecimalজেন্টুলেট শেষ বাক্যটিতে কেবল এটি বলা উচিত যে অভ্যন্তরীণভাবে তার অনাবৃত মানটিকে longপাশাপাশি একটিতে রাখে BigInteger। যদি BigIntegerঅভ্যন্তরীণভাবে এটির প্রয়োজন না হয় তবে এটি তৈরি হয় না তবে এটি প্রয়োজন হলে (যেমন equalsএকটি স্ফীত এবং যখন একটি স্ফীত-স্ফীততার মুখোমুখি হয় তখন BigDecimal) এটি তৈরি করতে ব্যবহৃত হয় - - সংক্ষেপে বলা যায়: inflate()প্রয়োজনে অভ্যন্তরীণ রূপান্তরগুলি পরিচালনা করে এবং যেহেতু এটি প্রয়োজন ক্লাসের ব্যবহারকারীদের জন্য এটি ব্যক্তিগত বিবেচনা করা উচিত না
টমাস

1

আমি বিশ্বাস করি যে সঠিক উত্তরটি হ'ল দুটি সংখ্যা (বিগডিসিমালস) করা, একই স্কেল থাকবে, তবে আমরা তাদের সমতা সম্পর্কে সিদ্ধান্ত নিতে পারি। উদাহরণস্বরূপ, এই দুটি সংখ্যা সমান?

1.00001 and 1.00002

ঠিক আছে, এটি স্কেলের উপর নির্ভর করে। স্কেল 5 (5 দশমিক পয়েন্ট) এ, তারা একই নয়। তবে ছোট দশমিক নির্ভুলতার (স্কেল 4 এবং নিম্ন) এগুলি সমান বলে বিবেচিত হয়। সুতরাং আমি দুটি সংখ্যার স্কেলকে সমান করার পরামর্শ দিই এবং তারপরে তাদের তুলনা করব।


-10

আপনি ডাবল মান সঙ্গে তুলনা করতে পারেন

BigDecimal a= new BigDecimal("1.1"); BigDecimal b =new BigDecimal("1.1");
System.out.println(a.doubleValue()==b.doubleValue());

5
যতটা সম্ভব এই সমাধানটি এড়াতে দয়া করে। এমনকি দ্বিগুণকেও "অ্যাপসিলন" এর সাথে তুলনা করা উচিত। বিগডিসিমাল থাকার এবং এটি দ্বিগুণ হিসাবে তুলনা করার কোনও বুদ্ধি নেই..এখানে খুব উচ্চ সম্ভাবনা রয়েছে যে আপনি নিজের পাটি গুলি করবেন।
ভাদিম কিরিলচুক

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