มีปัญหาเมื่อจัดการการตรวจสอบจำนวนเงินในสองวันที่ผ่านมา ฉันใช้วิธีการเท่ากับ BigDecimal เพื่อเปรียบเทียบว่าจำนวนสองจำนวนเท่ากันหรือไม่ซึ่งส่งผลให้เกิดข้อผิดพลาดในการเปรียบเทียบจำนวน (เช่นการเปรียบเทียบระหว่าง 3.0 ถึง 3.00 ฯลฯ )
[หมายเหตุ: สิ่งต่อไปนี้เป็นเรื่องเกี่ยวกับ Sun JDK เวอร์ชัน 1.4.2 เป็นตัวอย่าง การใช้งานของเวอร์ชันอื่นอาจไม่สอดคล้องกันโปรดเพิกเฉยต่อมัน]
ก่อนอื่นมาดูวิธี Equals ของ BigDecimal กันเถอะ:
บูลีนสาธารณะเท่ากับ (วัตถุ x) {ถ้า (! (x อินสแตนซ์ของ bigdecimal)) return false; bigdecimal xdec = (bigdecimal) x; return scale == xdec.scale && intval.equals (xdec.intval); -คุณจะเห็นได้ว่าวิธี Euquals ของ BigDecimal คือการกำหนดชนิดข้อมูลที่จะเปรียบเทียบก่อน หากประเภทวัตถุมีความสอดคล้องกันจะถูกกำหนดในเวลาเดียวกันว่าความแม่นยำ (มาตราส่วน) และค่า (วิธีการเท่ากับของ BigInteger) มีความสอดคล้องกัน
ในความเป็นจริงมันมีความชัดเจนมากใน javadoc: "เปรียบเทียบ bigdecimal นี้กับวัตถุที่ระบุเพื่อความเท่าเทียมกันซึ่งแตกต่างจากการเปรียบเทียบวิธีนี้จะพิจารณาวัตถุขนาดใหญ่สองวัตถุเท่ากับเฉพาะในกรณีที่พวกเขามีค่าและมาตราส่วนเท่ากัน (2.0 ไม่เท่ากับ 2.00 เมื่อเปรียบเทียบกับวิธีนี้)" ฉันไม่ได้ใส่ใจ!
ลองมาดูวิธีการเปรียบเทียบ:
public int compereto (bigdecimal val) {/ * การเพิ่มประสิทธิภาพ: จะทำงานได้ดีโดยไม่มีสามบรรทัดถัดไป */int sigdiff = signum () - val.signum (); ถ้า (sigdiff! = 0) return (sigdiff> 0? 1: -1);/ * สิ่งนี้; arg [1] = val; matchscale (arg); return arg [0] .intval.compareto (arg [1] .intval); - คุณจะเห็นว่ามีการประมวลผลแบบ matchscale ในวิธีนี้ซึ่งหมายถึงการแปลงวัตถุด้วยความแม่นยำต่ำถึงความแม่นยำสูงและจากนั้นเปรียบเทียบ (เช่นวิธีการเปรียบเทียบของ Biginteger) การใช้งานของ matchscale มีดังนี้:
โมฆะสแตติกส่วนตัวคู่ (bigdecimal [] val) {ถ้า (val [0] .scale <val [1] .scale) val [0] = val [0] .setscale (val [1] .scale); อื่น ๆ ถ้า (val [1] .scale <val [0] - ทำการทดสอบง่าย ๆ :
System.out.println (ใหม่ bigdecimal ("1.2"). เท่ากับ (ใหม่ bigdecimal ("1.20"))); // เอาท์พุท falsesystem.out.println (ใหม่ bigdecimal ("1.2"). compareto (ใหม่ bigdecimal ("1.20")) == 0); // เอาต์พุตจริง นอกจากนี้ยังสังเกตเห็นว่าตัวสร้างขนาดใหญ่ด้านบนถูกส่งผ่านในสตริง หากผ่านไปในประเภทตัวเลขจะเกิดอะไรขึ้น? คุณสามารถทดสอบด้วยตัวเองและวิเคราะห์เหตุผล:
System.out.println (ใหม่ bigdecimal ("1.2"). เท่ากับ (ใหม่ bigdecimal ("1.20"))); // เอาท์พุท falsesystem.out.println (ใหม่ bigdecimal ("1.2"). compareto (ใหม่ bigdecimal ("1.20")) == 0); // เอาท์พุท True System.out.println (ใหม่ BigDecimal (1.2) .Equals (ใหม่ BigDecimal ("1.20"))); // เอาท์พุทคือ it? system.out.println (ใหม่ BigDecimal (1.2) .Compareto (ใหม่ BigDecimal ("1.20")) == 0); // เป็นเอาต์พุตหรือไม่? System.out.println (ใหม่ BigDecimal (1.2) .Equals (ใหม่ BigDecimal (1.20))); // เป็นเอาต์พุตหรือไม่? System.out.println (ใหม่ BigDecimal (1.2) .Compareto (ใหม่ BigDecimal (1.20)) == 0); // เป็นเอาต์พุตหรือไม่?ข้อสรุปสุดท้ายคือ: สำหรับการเปรียบเทียบขนาดของ BigDecimal โดยใช้วิธี Equals จะไม่เพียง แต่เปรียบเทียบขนาดของค่า แต่ยังเปรียบเทียบความแม่นยำของวัตถุทั้งสองด้วย วิธีการเปรียบเทียบจะไม่เปรียบเทียบความแม่นยำ แต่เปรียบเทียบขนาดของค่าเท่านั้น
ในที่สุดฉันก็ดูถูกตัวเอง ฉันใช้ภาษาชวามาหลายปีแล้วและฉันก็ไม่ได้คิดสามัญสำนึกพื้นฐาน!
บทความข้างต้นพูดสั้น ๆ เกี่ยวกับความแตกต่างระหว่างความเท่าเทียมกันของ BigDecimal และการเปรียบเทียบใน Java เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น