เปรียบเทียบว่า BigDecimal มากกว่าศูนย์


245

ฉันจะเปรียบเทียบได้อย่างไรถ้าBigDecimalมูลค่ามากกว่าศูนย์


1
ดูเป็นgithub.com/mortezaadi/bigdecimal-utilsมีวิธี isPositive () นอกจากนี้ยังมีเช่นเดียวกับ (bigdecimal) .isZero (); คือ (BigDecimal) .notZero (); คือ (BigDecimal) .isPositive (); // มากกว่าศูนย์คือ (ใหญ่ที่สุด) .isNegative (); // น้อยกว่าศูนย์คือ (ใหญ่ที่สุด) .isNonPositive (); // น้อยกว่าหรือเท่ากับศูนย์คือ (ใหญ่ที่สุด) .isNonNegative ();
Morteza Adi

@MortezaAdi ตั้งแต่BigDecimalการดำเนินการComparableฟังก์ชั่นการเปรียบเทียบชอบดีกว่าถูกย้ายไปยังlt, le, eq, ne ComparableUtilsดังนั้นจึงสามารถใช้สำหรับคลาสอื่น ๆ เช่นDateหรือประเภทที่กำหนดเอง
djmj

@djmj ต้องการกำหนดการใช้งานไม่จำเป็นต้องมีหรือไม่มีความตั้งใจที่จะสร้าง ComparableUtils ข้างฟังก์ชั่นของ lt, le, eq, etc นั้นต่างจากรุ่นทั่วไปอย่างสิ้นเชิง
Morteza Adi

คำตอบ:


401

มันง่ายเหมือน:

if (value.compareTo(BigDecimal.ZERO) > 0)

เอกสารcompareToจริงระบุว่ามันจะกลับ -1, 0 หรือ 1 แต่ทั่วไปมากขึ้นComparable<T>.compareToวิธีเดียวที่รับประกันน้อยกว่าศูนย์ศูนย์หรือมากกว่าศูนย์สำหรับความเหมาะสมกรณีที่สาม - ดังนั้นฉันมักจะเพียงแค่ติดเพื่อเปรียบเทียบว่า


50
มีการเรียกคำเตือนเพิ่มเติม สมมติว่าvalueมีค่าเป็นศูนย์ แต่มีขนาดที่ไม่เป็นศูนย์ (เช่นประเมินเป็น0.00แทน0) คุณอาจต้องการพิจารณาว่ามันเท่ากับศูนย์ compareTo()วิธีการก็จะทำเช่นนี้ แต่equals()วิธีการจะไม่ (หลักฐานอีกข้อหนึ่งหากมีความจำเป็นโลกิหรืออวตารคนหนึ่งของเขายังมีชีวิตอยู่และดีและย้ายไปสู่การพัฒนาซอฟต์แวร์)
Andrew Spencer

9
ในขณะที่ฉันยอมรับว่านี่เป็นวิธีแก้ปัญหาสำนวนใน Java ฉันไม่คิดว่ามันจะอ่านได้จริง ทุกครั้งที่ฉันพบการแสดงออกเช่นนี้ฉันพบว่าตัวเองกำลังเขียนการทดสอบเพื่อให้ความมั่นใจกับตัวเองว่าฉันมีวิธีที่ถูกต้อง บางทีความจริงที่ว่าเมื่อเร็ว ๆ นี้ที่เพิ่มคลาสเช่นLocalDateรวมisBeforeเป็นข้อบ่งชี้ว่า Oracle รู้สึกแบบเดียวกัน มันไม่เหมาะ แต่ฉันคิดว่ามันอ่านได้ง่ายกว่าเล็กน้อยในสถานการณ์เหล่านี้เพื่อเขียนisGreaterThanวิธีอรรถประโยชน์
Mark Slater

วิธีการแก้ปัญหา @Jon Skeet ยังใช้งานได้หากค่าเป็น 0.00 หรือ 0.0
Angelina

1
@ แองเจลิน่า: ฉันคาดหวังไว้แน่นอน - ค่าเหล่านั้นไม่มากกว่า 0 ดังนั้นฉันคาดหวังcompareToให้คืน 0 แต่ถ้าคุณเป็นห่วงคุณควรทดสอบง่าย
Jon Skeet

@ MarkSlater ฉันเห็นด้วย, comparTo เป็นเพียง Java ควรลงทุนเวลามากขึ้นในการปรับปรุงการอ่านและมันไม่มีเหตุผลถ้าทุกคนต้องสร้างวิธีการอ่านของตัวเองในทุกโครงการ ใน C # คุณยังสามารถสร้างวิธีการขยายสำหรับคลาสที่มีอยู่เพื่อให้คุณสามารถใช้ `value.isGreaterThen (foo)` `ได้
โดยตรง

165

12
BigDecimal.compareTo () เริ่มต้นด้วยการเปรียบเทียบ signums เป็นการเพิ่มประสิทธิภาพ ดังนั้นจึงเป็นเรื่องที่ดีที่สุดในการโทรเปรียบเทียบกับ () เนื่องจากเป็นการเปิดเผยโดยเจตนามากกว่าและมีค่าใช้จ่ายเฉพาะราคาของการโทรด้วยวิธีพิเศษเท่านั้น
Andrew Spencer

27
นี่เป็นส่วนหนึ่งของ API สาธารณะ ดังนั้นสำหรับฉันมันเป็นวิธีที่ดีกว่า ความตั้งใจที่จะตรวจสอบว่าสัญญาณที่เป็นบวก (เช่น> ZERO)
มาร์ค

คุณคิดว่ามันมีประสิทธิภาพสูงกว่าหรือไม่ถ้ามันคว้าตัวละครตัวแรกของการStringเริ่มต้นBigDecimalเพื่อดูว่ามันเป็น-หรือไม่? นั่นคือการคาดเดาที่ดีที่สุดของฉันเกี่ยวกับวิธีการทำงาน ดูเหมือนว่าจะเร็วขึ้นเพื่อตรวจสอบว่าจำนวน0จริง ถูกต้องหรือไม่ ขอบคุณมากล่วงหน้า Anton Bessonov!

5
หากคุณดูที่BigDecimal.compareTo()วิธีการถอดรหัสข้อมูลคุณจะพบว่ามันเรียกsignum()สองครั้ง ดังนั้นเท่าที่ประสิทธิภาพจะsignum()ดีกว่า
ฉัน

1
คุณมีปัญหาอะไรกับเรื่องทศนิยม? @jfajunior
İsmail Yavuz


1

การใช้วิธีนี้ปลอดภัยกว่า compareTo()

    BigDecimal a = new BigDecimal(10);
    BigDecimal b = BigDecimal.ZERO;

    System.out.println(" result ==> " + a.compareTo(b));

พิมพ์คอนโซล

    result ==> 1

compareTo() ผลตอบแทน

  • 1 ถ้า a มากกว่า b
  • -1 ถ้า b น้อยกว่า b
  • 0 ถ้า a เท่ากับ b

ตอนนี้สำหรับปัญหาของคุณคุณสามารถใช้

if (value.compareTo(BigDecimal.ZERO) > 0)

หรือ

if (value.compareTo(new BigDecimal(0)) > 0)

ฉันหวังว่ามันจะช่วยคุณ


0

ใช้ ".intValue ()" บนวัตถุ BigDecimal ไม่ถูกต้องเมื่อคุณต้องการตรวจสอบว่าตัวขูดของมันมากกว่าศูนย์หรือไม่ ตัวเลือกเดียวที่เหลืออยู่คือวิธี ".compareTo ()"


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