วิธีใช้ตัวดำเนินการเปรียบเทียบเช่น>, =, <บน BigDecimal


106

ฉันมีคลาสโดเมนที่ตั้งค่าหน่วยราคาเป็นประเภทข้อมูล BigDecimal ตอนนี้ฉันกำลังพยายามสร้างวิธีเปรียบเทียบราคา แต่ดูเหมือนว่าฉันไม่มีตัวดำเนินการเปรียบเทียบในประเภทข้อมูล BigDecimal ฉันต้องเปลี่ยนประเภทข้อมูลหรือมีวิธีอื่นไหม


เนื่องจากBigDecimalเป็นสิ่งObjectนี้ไม่ได้ผล แต่คุณก็สามารถลบหนึ่งจากแต่ละอื่น ๆ และตรวจสอบว่าค่าผลลัพธ์คือ<0, หรือ==0 >0มิฉะนั้นคุณสามารถใช้วิธีมาตรฐานด้วยวิธีการที่ให้มาจากBigDecimal
SomeJavaGuy

2
เหตุใดจึงมีcompareToเมธอดที่คืนค่า -1, 0 หรือ 1 ซึ่งโดยพื้นฐานแล้วคือComparable.
M. Deinum

คำตอบ:


117

ทุกออบเจ็กต์ของคลาสBigDecimalมีวิธีที่compareToคุณสามารถใช้เพื่อเปรียบเทียบกับ BigDecimal อื่นได้ ผลมาจากการcompareToถูกเปรียบเทียบแล้ว> 0, == 0หรือ< 0ขึ้นอยู่กับสิ่งที่คุณต้องการ อ่านเอกสารและคุณจะพบ

ผู้ประกอบการ==, <, >และอื่น ๆ สามารถนำมาใช้เฉพาะกับชนิดข้อมูลดั้งเดิมเช่นint, long, doubleหรือชั้นเรียนของพวกเขาเช่นเสื้อคลุมและIntegerDouble

จากเอกสารของcompareTo:

เปรียบเทียบกับที่ระบุไว้BigDecimalBigDecimal

BigDecimal วัตถุสองชิ้นที่มีค่าเท่ากัน แต่มีมาตราส่วนต่างกัน (เช่น 2.0 และ 2.00) จะถือว่าเท่ากันโดยวิธีนี้ วิธีนี้จัดเตรียมไว้ตามความต้องการของแต่ละวิธีสำหรับแต่ละตัวดำเนินการเปรียบเทียบบูลีนหกตัว (<, ==,>,> =,! =, <=) สำนวนเสนอแนะสำหรับการดำเนินการเปรียบเทียบเหล่านี้คือ(x.compareTo(y) <op> 0)ที่<op> เป็นหนึ่งในผู้ประกอบการเปรียบเทียบหก

ผลตอบแทน: -1, 0 หรือ 1 เนื่องจาก BigDecimal นี้เป็นตัวเลขที่น้อยกว่าเท่ากับหรือมากกว่า val


1
แต่วิธีการ CompareTo ช่วยในการค้นหาว่าราคามากกว่าเท่ากับหรือต่ำกว่าหรือไม่
user3127109

2
ใช่. ข้อมูลนั้นอยู่ในลิงก์ที่ให้ไว้ในคำตอบ
Drew Kennedy

4
@ user3127109 ใช่a.compareTo(b)ผลตอบแทนมากกว่าจำนวนกว่าศูนย์ถ้าa > b, 0ถ้าและน้อยกว่าศูนย์ถ้าa == b a < b
Zoltán

124

สั้น:

firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"    
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="  
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="    

22

ใช้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.


11

นี่คือตัวอย่างของตัวดำเนินการเปรียบเทียบบูลีนทั้งหกตัว (<, ==,>,> =,! =, <=):

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

5

BigDecimalไม่ได้เป็นแบบดั้งเดิมดังนั้นคุณจึงไม่สามารถใช้<, >ผู้ประกอบการ อย่างไรก็ตามเนื่องจากเป็น a Comparableคุณจึงสามารถใช้เอcompareTo(BigDecimal)ฟเฟกต์เดียวกันได้ เช่น:

public class Domain {
    private BigDecimal unitPrice;

    public boolean isCheaperThan(BigDecimal other) {
        return unitPirce.compareTo(other.unitPrice) < 0;
    }

    // etc...
}

1

เธรดนี้มีคำตอบมากมายที่ระบุว่าเมธอด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)วิธีการ


0

การใช้คลาส util com.ibm.etools.marshall.util.BigDecimalRangeของ IBM สามารถเปรียบเทียบได้ว่าBigDecimalอยู่ในช่วงหรือไม่

boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.