ฉันมีคลาสโดเมนที่ตั้งค่าหน่วยราคาเป็นประเภทข้อมูล BigDecimal ตอนนี้ฉันกำลังพยายามสร้างวิธีเปรียบเทียบราคา แต่ดูเหมือนว่าฉันไม่มีตัวดำเนินการเปรียบเทียบในประเภทข้อมูล BigDecimal ฉันต้องเปลี่ยนประเภทข้อมูลหรือมีวิธีอื่นไหม
ฉันมีคลาสโดเมนที่ตั้งค่าหน่วยราคาเป็นประเภทข้อมูล BigDecimal ตอนนี้ฉันกำลังพยายามสร้างวิธีเปรียบเทียบราคา แต่ดูเหมือนว่าฉันไม่มีตัวดำเนินการเปรียบเทียบในประเภทข้อมูล BigDecimal ฉันต้องเปลี่ยนประเภทข้อมูลหรือมีวิธีอื่นไหม
compareTo
เมธอดที่คืนค่า -1, 0 หรือ 1 ซึ่งโดยพื้นฐานแล้วคือComparable
.
คำตอบ:
ทุกออบเจ็กต์ของคลาสBigDecimal
มีวิธีที่compareTo
คุณสามารถใช้เพื่อเปรียบเทียบกับ BigDecimal อื่นได้ ผลมาจากการcompareTo
ถูกเปรียบเทียบแล้ว> 0
, == 0
หรือ< 0
ขึ้นอยู่กับสิ่งที่คุณต้องการ อ่านเอกสารและคุณจะพบ
ผู้ประกอบการ==
, <
, >
และอื่น ๆ สามารถนำมาใช้เฉพาะกับชนิดข้อมูลดั้งเดิมเช่นint
, long
, double
หรือชั้นเรียนของพวกเขาเช่นเสื้อคลุมและInteger
Double
จากเอกสารของcompareTo
:
เปรียบเทียบกับที่ระบุไว้
BigDecimal
BigDecimal
BigDecimal
วัตถุสองชิ้นที่มีค่าเท่ากัน แต่มีมาตราส่วนต่างกัน (เช่น 2.0 และ 2.00) จะถือว่าเท่ากันโดยวิธีนี้ วิธีนี้จัดเตรียมไว้ตามความต้องการของแต่ละวิธีสำหรับแต่ละตัวดำเนินการเปรียบเทียบบูลีนหกตัว (<, ==,>,> =,! =, <=) สำนวนเสนอแนะสำหรับการดำเนินการเปรียบเทียบเหล่านี้คือ(x.compareTo(y) <op> 0)
ที่<op>
เป็นหนึ่งในผู้ประกอบการเปรียบเทียบหกผลตอบแทน: -1, 0 หรือ 1 เนื่องจาก BigDecimal นี้เป็นตัวเลขที่น้อยกว่าเท่ากับหรือมากกว่า val
a.compareTo(b)
ผลตอบแทนมากกว่าจำนวนกว่าศูนย์ถ้าa > b
, 0
ถ้าและน้อยกว่าศูนย์ถ้าa == b
a < b
สั้น:
firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="
ใช้compareTo
วิธีการของ BigDecimal:
int สาธารณะ CompareTo (BigDecimal val) เปรียบเทียบ BigDecimal นี้กับ BigDecimal ที่ระบุ
Returns: -1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.
คุณสามารถใช้เมธอดชื่อcompareTo
, x.compareTo(y)
. มันจะคืนค่า 0 ถ้า x และ y เท่ากัน 1 ถ้า x มากกว่า y และ -1 ถ้า x มีขนาดเล็กกว่า y
นี่คือตัวอย่างของตัวดำเนินการเปรียบเทียบบูลีนทั้งหกตัว (<, ==,>,> =,! =, <=):
BigDecimal big10 = new BigDecimal(10);
BigDecimal big20 = new BigDecimal(20);
System.out.println(big10.compareTo(big20) < -1); // false
System.out.println(big10.compareTo(big20) <= -1); // true
System.out.println(big10.compareTo(big20) == -1); // true
System.out.println(big10.compareTo(big20) >= -1); // true
System.out.println(big10.compareTo(big20) > -1); // false
System.out.println(big10.compareTo(big20) != -1); // false
System.out.println(big10.compareTo(big20) < 0); // true
System.out.println(big10.compareTo(big20) <= 0); // true
System.out.println(big10.compareTo(big20) == 0); // false
System.out.println(big10.compareTo(big20) >= 0); // false
System.out.println(big10.compareTo(big20) > 0); // false
System.out.println(big10.compareTo(big20) != 0); // true
System.out.println(big10.compareTo(big20) < 1); // true
System.out.println(big10.compareTo(big20) <= 1); // true
System.out.println(big10.compareTo(big20) == 1); // false
System.out.println(big10.compareTo(big20) >= 1); // false
System.out.println(big10.compareTo(big20) > 1); // false
System.out.println(big10.compareTo(big20) != 1); // true
BigDecimal
ไม่ได้เป็นแบบดั้งเดิมดังนั้นคุณจึงไม่สามารถใช้<
, >
ผู้ประกอบการ อย่างไรก็ตามเนื่องจากเป็น a Comparable
คุณจึงสามารถใช้เอcompareTo(BigDecimal)
ฟเฟกต์เดียวกันได้ เช่น:
public class Domain {
private BigDecimal unitPrice;
public boolean isCheaperThan(BigDecimal other) {
return unitPirce.compareTo(other.unitPrice) < 0;
}
// etc...
}
เธรดนี้มีคำตอบมากมายที่ระบุว่าเมธอดBigDecimal.compareTo (BigDecimal)เป็นวิธีที่ใช้เปรียบเทียบอินสแตนซ์BigDecimal ฉันแค่อยากจะเพิ่มสำหรับอีกต่อไปที่ไม่มีประสบการณ์กับการใช้เมธอดBigDecimal.compareTo (BigDecimal)เพื่อให้ระมัดระวังกับวิธีที่คุณสร้างอินสแตนซ์BigDecimalของคุณ ตัวอย่างเช่น ...
new BigDecimal(0.8)
จะสร้างBigDecimal
อินสแตนซ์ที่มีค่าซึ่งไม่ตรง0.8
และมีมาตราส่วน 50+new BigDecimal("0.8")
จะสร้างBigDecimal
อินสแตนซ์ที่มีค่าซึ่งเป็นที่แน่นอน0.8
และที่มีระดับ 1... และทั้งสองจะถือว่าไม่เท่ากันตามเมธอดBigDecimal.compareTo (BigDecimal)เนื่องจากค่าของมันไม่เท่ากันเมื่อมาตราส่วนไม่ได้ จำกัด อยู่ที่ทศนิยมไม่กี่ตำแหน่ง
ก่อนอื่นโปรดระมัดระวังในการสร้างBigDecimal
อินสแตนซ์ของคุณด้วยตัวBigDecimal(String val)
สร้างหรือBigDecimal.valueOf(double val)
วิธีการแทนตัวBigDecimal(double val)
สร้าง ประการที่สองทราบว่าคุณสามารถ จำกัด ขนาดของBigDecimalกรณีก่อนที่จะเปรียบเทียบพวกเขาโดยวิธีการของBigDecimal.setScale (int newScale, RoundingMode roundingMode)วิธีการ
การใช้คลาส util com.ibm.etools.marshall.util.BigDecimalRangeของ IBM สามารถเปรียบเทียบได้ว่าBigDecimalอยู่ในช่วงหรือไม่
boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);
BigDecimal
เป็นสิ่งObject
นี้ไม่ได้ผล แต่คุณก็สามารถลบหนึ่งจากแต่ละอื่น ๆ และตรวจสอบว่าค่าผลลัพธ์คือ<0
, หรือ==0
>0
มิฉะนั้นคุณสามารถใช้วิธีมาตรฐานด้วยวิธีการที่ให้มาจากBigDecimal