আমার জাভাতে নিম্নলিখিত কোড রয়েছে;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
শর্তটি লেখার সবচেয়ে ভাল উপায় কী?
আমার জাভাতে নিম্নলিখিত কোড রয়েছে;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
শর্তটি লেখার সবচেয়ে ভাল উপায় কী?
উত্তর:
এর 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
বিকল্পভাবে, সাইনাম () ব্যবহার করা যেতে পারে:
if (price.signum() == 0) {
return true;
}
BigDecimal.ZERO.compareTo(null)
এমন একটি ধ্রুবক রয়েছে যার বিরুদ্ধে আপনি পরীক্ষা করতে পারেন:
someBigDecimal.compareTo(BigDecimal.ZERO) == 0
equals
এবং compareTo
আপনি যেমন ভাবেন তেমন নয়। docs.oracle.com/javase/1.5.0/docs/api/java/math/…
বিকল্পভাবে, আমি মনে করি এটি উল্লেখযোগ্য যে ক্লাস বিগডিসিমালে সমান এবং তুলনামূলক পদ্ধতিগুলির আচরণ একে অপরের সাথে সামঞ্জস্যপূর্ণ নয় ।
এর মূলত এর অর্থ:
BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO)==0); //true
System.out.println(someValue.equals(BigDecimal.ZERO)); //false
অতএব, আপনার someValue
ভেরিয়েবলের স্কেলটি সম্পর্কে আপনাকে খুব সাবধানতা অবলম্বন করতে হবে, অন্যথায় আপনি অপ্রত্যাশিত ফলাফল পাবেন।
আপনি সমান () যেহেতু তারা অবজেক্টস ব্যবহার করতে চান, এবং জিরো উদাহরণস্বরূপে বিল্টটি ব্যবহার করতে পারেন:
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/…
equals
অ্যাকাউন্টে স্কেল নেয়, যা আমরা এখানে চাই না।
equals
উচিতcompareTo()
। ওপি কোন ধরণের গণিত ব্যবহার করছে তা নির্দিষ্ট করে না, তাই আপনি ঠিক বলেছেন যে তাকে দুটি বিকল্পই দেওয়া ভাল।
গ্রিফিডগ অবশ্যই স্পষ্টভাবে সঠিক:
কোড:
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
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));
একটি স্থিতিশীল ধ্রুবক রয়েছে যা 0 :
BigDecimal.ZERO.equals(selectPrice)
পরিবর্তে আপনার এটি করা উচিত:
selectPrice.equals(BigDecimal.ZERO)
যাতে মামলা এড়ানোর selectPrice
জন্য null
।
equals
এবং compareTo
আপনি যেমন ভাবেন তেমন নয়। docs.oracle.com/javase/1.5.0/docs/api/java/math/…