BigDecimal setScale และ round


140

ความแตกต่างระหว่างการโทรสองครั้งนี้คืออะไร? (มีผู้ใด?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);

6
นอกเหนือจากคำตอบที่ได้รับการยอมรับด้านล่าง - setScale () สร้างวัตถุใหม่ของ BigDecimal - เนื่องจากคลาสที่ไม่เปลี่ยนรูป
prash

9
@prash roundเมธอดยังส่งคืนอินสแตนซ์ใหม่ของ BigDecimal เพราะอย่างที่คุณบอกว่าอินสแตนซ์นั้นไม่เปลี่ยนรูป
daiscog

คำตอบ:


212

จุดสำคัญอย่างหนึ่งที่พาดพิงถึง แต่ไม่ได้กล่าวถึงโดยตรงคือความแตกต่างระหว่าง"ความแม่นยำ"และ"สเกล"และวิธีที่ใช้ในสองข้อความ "ความแม่นยำ"คือจำนวนรวมของตัวเลขนัยสำคัญในจำนวนหนึ่ง "scale"คือจำนวนตัวเลขทางด้านขวาของจุดทศนิยม

Constructor MathContext ยอมรับเฉพาะความแม่นยำและ RoundingMode เป็นอาร์กิวเมนต์เท่านั้นดังนั้นสเกลจะไม่ถูกระบุในคำสั่งแรก

setScale() เห็นได้ชัดว่ายอมรับขนาดเป็นอาร์กิวเมนต์เช่นเดียวกับ RoundingMode แต่ความแม่นยำไม่เคยระบุไว้ในคำสั่งที่สอง

หากคุณเลื่อนจุดทศนิยมไปทางขวาความแตกต่างจะชัดเจน:

// 1.
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
//result = 35.35
// 2.
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
// result = 35.3456

38
Re: "" ความแม่นยำ "คือจำนวนหลักทั้งหมดในตัวเลข" ไม่แม่นยำคือจำนวนหลักที่มีนัยสำคัญ ความแม่นยำของ 0.000042M คือ 2
David J.

2
ดู: "ความแม่นยำ": จำนวนหลักเริ่มต้นจากตัวเลขที่ไม่ใช่ศูนย์ซ้ายสุดของผลลัพธ์ที่แน่นอน docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
Eddy

ถ้า "ความแม่นยำคือจำนวนตัวเลขนัยสำคัญ" มากกว่าสาเหตุที่ความแม่นยำ 0.0000009 มาเป็น 2 ควรเป็น 1
Sanchi Girotra

1
มูลค่าของ BigDecimal ของคุณเป็นอย่างไร คุณจะส่งออกค่าอย่างไร (โดยใช้ String.format () อาจซ่อนเลขนัยสำคัญ)
dale peters

1
@SanchiGirotra ความแม่นยำคือ "จำนวนตัวเลขในค่าที่ไม่ปรับสัดส่วน" ความแม่นยำ 2 ที่มีค่าunscaledเท่ากับ 90 และมาตราส่วน 8 ให้ 0.0000009 เช่นเดียวกับความแม่นยำ 1 ค่าที่ไม่ลดขนาดเท่ากับ 9 และมาตราส่วน 7
daiscog

52

มีความแตกต่างใหญ่จริง ๆ ซึ่งคุณควรทราบ setScale ตั้งค่าสเกลของตัวเลขในขณะที่รอบจะปัดตัวเลขของคุณเป็นตัวเลขที่ระบุ แต่ "เริ่มต้นจากหลักซ้ายสุดของผลลัพธ์ที่แน่นอน" ตามที่กล่าวไว้ใน jdk ดังนั้นเกี่ยวกับตัวอย่างของคุณผลลัพธ์เหมือนกัน แต่ลอง 0.0034 แทน นี่คือข้อความของฉันเกี่ยวกับสิ่งนั้นในบล็อกของฉัน:

http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html

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