জাভাতে বিগডেসিমাল ভেরিয়েবল == 0 আছে কিনা তা কীভাবে পরীক্ষা করবেন?


202

আমার জাভাতে নিম্নলিখিত কোড রয়েছে;

BigDecimal price; // assigned elsewhere

if (price.compareTo(new BigDecimal("0.00")) == 0) {
    return true;
}

শর্তটি লেখার সবচেয়ে ভাল উপায় কী?


12
অনেক উত্তর বিগডেসিমেলের .equals () পদ্ধতিটি ব্যবহার করার পরামর্শ দিচ্ছে। তবে সেই পদ্ধতিটি বিবেচনার ভিত্তিতে স্কেল গ্রহণ করে, তাই তুলনাটো () ব্যবহার করার সমতুল্য নয়।
গ্রিফিডগ

উত্তর:


472

এর compareTo(BigDecimal.ZERO)পরিবর্তে ব্যবহার করুন equals():

if (price.compareTo(BigDecimal.ZERO) == 0) // see below

BigDecimalধ্রুবকের সাথে তুলনা করে প্রতিটি সম্পাদন কার্যকর করা BigDecimal.ZEROএড়ানো যায় new BigDecimal(0)

অবগতির জন্য, BigDecimalএছাড়াও ধ্রুবক রয়েছে BigDecimal.ONEএবং BigDecimal.TENআপনার সুবিধার জন্য।


বিঃদ্রঃ!

আপনি ব্যবহার করতে পারবেন না কারণ BigDecimal#equals()এটি স্কেল বিবেচনায় নেয় :

new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!

সুতরাং এটি সম্পূর্ণরূপে সংখ্যার তুলনার জন্য অনুপযুক্ত। তবে BigDecimal.compareTo()তুলনা করার সময় স্কেল বিবেচনা করে না:

new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true

বিগডিসিমাল.জেরো.কম স্প্রেটো (দাম) == 0
জ্যাককোবেক

97

বিকল্পভাবে, সাইনাম () ব্যবহার করা যেতে পারে:

if (price.signum() == 0) {
    return true;
}

21
সম্ভবত এটি দ্রুত, তবে তুলনা করুন (বিগডিসিমাল.জিরো) আরও পঠনযোগ্য।
এলায়ানতে

@ এলিয়্যান্ট, আপনি সর্বদা এটি পদ্ধতির সাহায্যে মুড়িয়ে রাখতে পারেন, এর আরও পাঠযোগ্য নাম রয়েছে বা এমনকি আপনার ব্যবসায়-যুক্তির কিছু অংশ বর্ণনা করেছেন, যেমন তুলনার সাথে সংযুক্ত
ওয়েগা

3
বিস্ময়করভাবে সাইনাম () বাতিল-নিরাপদ নয়, যখন বিগডিসিমাল.জিরো.কম্পিয়ারটো () এর মতো তুলনা করার সময় তুলনা করা হয়, তাই এতে মনোযোগ দিন
ওয়েগা

15
@ ওয়েগা এটি সত্য নয়: এনপিইBigDecimal.ZERO.compareTo(null)
এসিভি

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

24

এমন একটি ধ্রুবক রয়েছে যার বিরুদ্ধে আপনি পরীক্ষা করতে পারেন:

someBigDecimal.compareTo(BigDecimal.ZERO) == 0

3
"Yoda শর্ত" এর আপনার পরিভাষা চুরি করার অনুমতি রইল।
সিম্পিপান্ডা


জাভা বিগডিসিমালের আচরণ equalsএবং compareToআপনি যেমন ভাবেন তেমন নয়। docs.oracle.com/javase/1.5.0/docs/api/java/math/…
nhahtdh

2
বিগডিসিমেলের তুলনা করুন আপনি যদি শূন্যে পাস করেন তবে এখনও একটি ব্যতিক্রম ছুঁড়ে ফেলবেন।
জন জিয়াং

5

আমি সাধারণত নিম্নলিখিতটি ব্যবহার করি:

if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }

5

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

এর মূলত এর অর্থ:

BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO)==0); //true
System.out.println(someValue.equals(BigDecimal.ZERO)); //false

অতএব, আপনার someValueভেরিয়েবলের স্কেলটি সম্পর্কে আপনাকে খুব সাবধানতা অবলম্বন করতে হবে, অন্যথায় আপনি অপ্রত্যাশিত ফলাফল পাবেন।


5

আপনি সমান () যেহেতু তারা অবজেক্টস ব্যবহার করতে চান, এবং জিরো উদাহরণস্বরূপে বিল্টটি ব্যবহার করতে পারেন:

if(selectPrice.equals(BigDecimal.ZERO))

নোটটি যে .equals()অ্যাকাউন্টে স্কেল নেয়, সুতরাং যদি না সিলেক্টপ্রাইস একই স্কেল (0) না হয় .ZEROতবে এটি মিথ্যা হিসাবে ফিরে আসবে।

সমীকরণটি যেমন ছিল তেমন স্কেল নেওয়া:

if(selectPrice.compareTo(BigDecimal.ZERO) == 0)

আমার অবশ্যই লক্ষ্য করা উচিত যে কয়েকটি গাণিতিক পরিস্থিতিতে 0.00 != 0, যার জন্য আমি কল্পনা .equals()করে স্কেলটিকে বিবেচনায় নিয়েছি । 0.00শততম স্থানে নির্ভুলতা দেয়, যদিও 0এটি যথাযথ নয়। আপনি নির্ভর করতে পারেন পরিস্থিতি উপর নির্ভর করে .equals()


জাভা বিগডিসিমালের আচরণ equalsএবং compareToআপনি যেমন ভাবেন তেমন নয়। docs.oracle.com/javase/1.5.0/docs/api/java/math/…
nhahtdh

দস্তাবেজের সাথে সংযোগ স্থাপনের পরিবর্তে আপনি কী বোঝাতে চাইছেন তা ব্যাখ্যা করার জন্য যত্নশীল? আমি যা পরামর্শ দিয়েছি তা ওপি-র জন্য কাজ করা উচিত।
নমনসিম

এডউইন ডালোরজোর উত্তর এটি বেশ ভালভাবে ব্যাখ্যা করেছে। equalsঅ্যাকাউন্টে স্কেল নেয়, যা আমরা এখানে চাই না।
nhahtdh

@ নাহহঠঃ তথ্যের জন্য ধন্যবাদ, বাস্তবে যদিও এমন পরিস্থিতি রয়েছে যেখানে পরিবর্তে ব্যবহার করা equals উচিতcompareTo() । ওপি কোন ধরণের গণিত ব্যবহার করছে তা নির্দিষ্ট করে না, তাই আপনি ঠিক বলেছেন যে তাকে দুটি বিকল্পই দেওয়া ভাল।
নমনসিম

3

গ্রিফিডগ অবশ্যই স্পষ্টভাবে সঠিক:

কোড:

BigDecimal myBigDecimal = new BigDecimal("00000000.000000");
System.out.println("bestPriceBigDecimal=" + myBigDecimal);
System.out.println("BigDecimal.valueOf(0.000000)=" + BigDecimal.valueOf(0.000000));
System.out.println(" equals=" + myBigDecimal.equals(BigDecimal.ZERO));
System.out.println("compare=" + (0 == myBigDecimal.compareTo(BigDecimal.ZERO)));

ফলাফল:

myBigDecimal=0.000000
BigDecimal.valueOf(0.000000)=0.0
 equals=false
compare=true

আমি বিগডিসিমাল তুলনার সুবিধাগুলি বুঝতে পারার পরেও আমি এটিকে একটি স্বজ্ঞাত নির্মাণ হিসাবে বিবেচনা করব না (যেমন ==, <,>, <=,> = অপারেটররা)। যখন আপনি আপনার মাথায় দশ মিলিয়ন জিনিস (ঠিক আছে, সাতটি জিনিস) ধরে আছেন, তখন আপনার জ্ঞানীয় বোঝা হ্রাস করতে পারে এমন কোনও জিনিসই ভাল জিনিস। সুতরাং আমি কিছু দরকারী সুবিধার ফাংশন নির্মিত:

public static boolean equalsZero(BigDecimal x) {
    return (0 == x.compareTo(BigDecimal.ZERO));
}
public static boolean equals(BigDecimal x, BigDecimal y) {
    return (0 == x.compareTo(y));
}
public static boolean lessThan(BigDecimal x, BigDecimal y) {
    return (-1 == x.compareTo(y));
}
public static boolean lessThanOrEquals(BigDecimal x, BigDecimal y) {
    return (x.compareTo(y) <= 0);
}
public static boolean greaterThan(BigDecimal x, BigDecimal y) {
    return (1 == x.compareTo(y));
}
public static boolean greaterThanOrEquals(BigDecimal x, BigDecimal y) {
    return (x.compareTo(y) >= 0);
}

সেগুলি কীভাবে ব্যবহার করবেন তা এখানে:

    System.out.println("Starting main Utils");
    BigDecimal bigDecimal0 = new BigDecimal(00000.00);
    BigDecimal bigDecimal2 = new BigDecimal(2);
    BigDecimal bigDecimal4 = new BigDecimal(4);  
    BigDecimal bigDecimal20 = new BigDecimal(2.000);
    System.out.println("Positive cases:");
    System.out.println("bigDecimal0=" + bigDecimal0 + " == zero is " + Utils.equalsZero(bigDecimal0));
    System.out.println("bigDecimal2=" + bigDecimal2 + " <  bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThan(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
    System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
    System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThanOrEquals(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal4=" + bigDecimal4 + " >  bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThan(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal4=" + bigDecimal4 + " >= bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThanOrEquals(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal20=" + bigDecimal20 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal20));
    System.out.println("Negative cases:");
    System.out.println("bigDecimal2=" + bigDecimal2 + " == zero is " + Utils.equalsZero(bigDecimal2));
    System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal4=" + bigDecimal4 + " is " + Utils.equals(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal4=" + bigDecimal4 + " <  bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThan(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal4=" + bigDecimal4 + " <= bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThanOrEquals(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal2=" + bigDecimal2 + " >  bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThan(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal4));

ফলাফলগুলি এর মতো দেখাচ্ছে:

Positive cases:
bigDecimal0=0 == zero is true
bigDecimal2=2 <  bigDecimal4=4 is true
bigDecimal2=2 == bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal4=4 is true
bigDecimal4=4 >  bigDecimal2=2 is true
bigDecimal4=4 >= bigDecimal2=2 is true
bigDecimal2=2 >= bigDecimal20=2 is true
Negative cases:
bigDecimal2=2 == zero is false
bigDecimal2=2 == bigDecimal4=4 is false
bigDecimal4=4 <  bigDecimal2=2 is false
bigDecimal4=4 <= bigDecimal2=2 is false
bigDecimal2=2 >  bigDecimal4=4 is false
bigDecimal2=2 >= bigDecimal4=4 is false

1
একাধিক উত্তর হুবহু এটি ব্যাখ্যা করছে। আরেকটি উত্তর যুক্ত করার অর্থ কী? আপনার যদি অতিরিক্ত তথ্য থাকে তবে নতুন উত্তর যুক্ত করা ভাল is তবে এই পোস্টে এটি হয় না।
টম

পয়েন্ট নেওয়া হয়েছে। যাইহোক, আমি যখন কিছু শিখছি তখন আমি যতটা সম্ভব উদাহরণ দেখতে চাই, সেগুলি সাদৃশ্যপূর্ণ হলেও। টম, আপনার জন্য আমি আমার লাইব্রেরি যুক্ত করেছি যা আমি দরকারী বলে মনে করি। আপনার মাইলেজ বিভিন্ন রকম হতে পারে। :-)
তিহামার

0

কোটলিনের জন্য এখানে কিছু সহায়ক এক্সটেনশানগুলি কেবল ভাগ করতে চাই

fun BigDecimal.isZero() = compareTo(BigDecimal.ZERO) == 0
fun BigDecimal.isOne() = compareTo(BigDecimal.ONE) == 0
fun BigDecimal.isTen() = compareTo(BigDecimal.TEN) == 0

-2
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));

1
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, কেবল এখনই জিজ্ঞাসা করা ব্যক্তি নয়! একটি ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন এবং কোন সীমাবদ্ধতা এবং অনুমানগুলি প্রযোজ্য তা একটি ইঙ্গিত দিন। এই উত্তরটি কেন অন্যদের চেয়ে বেশি উপযুক্ত তা উল্লেখ করেও তা ক্ষতি করে না।
দেব-আইএল

-8

একটি স্থিতিশীল ধ্রুবক রয়েছে যা 0 :

BigDecimal.ZERO.equals(selectPrice)

পরিবর্তে আপনার এটি করা উচিত:

selectPrice.equals(BigDecimal.ZERO)

যাতে মামলা এড়ানোর selectPriceজন্য null


3
জাভা বিগডিসিমালের আচরণ equalsএবং compareToআপনি যেমন ভাবেন তেমন নয়। docs.oracle.com/javase/1.5.0/docs/api/java/math/…
nhahtdh

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