นอกจากนี้สำหรับ BigDecimal


155

ฉันต้องการผลรวมอย่างง่ายที่มีค่าสกุลเงินบางอย่างที่แสดงในBigDecimalรูปแบบ

BigDecimal test = new BigDecimal(0);
System.out.println(test);
test.add(new BigDecimal(30));
System.out.println(test);
test.add(new BigDecimal(45));
System.out.println(test);

เห็นได้ชัดว่าฉันไม่เข้าใจBigDecimalเลขคณิตดีดูผลลัพธ์ที่อยู่เบื้องหลัง

Test
0
0
0

ใครช่วยฉันออกได้บ้าง

คำตอบ:


275

The BigDecimalไม่เปลี่ยนรูปดังนั้นคุณต้องทำสิ่งนี้:

BigDecimal result = test.add(new BigDecimal(30));
System.out.println(result);

27
ฉันสามารถเข้าใจความสับสน แม้ว่าจะระบุไว้ว่า BigDecimal นั้นไม่สามารถเปลี่ยนแปลงได้ แต่เอกสารอาจดีกว่านี้ ตัวอย่างเช่นสถานะเอกสารสำหรับวิธีการadd(..): "เพิ่ม - ค่าที่จะเพิ่มใน BigDecimal นี้" นอกจากนี้การพูดว่า "... จะส่งกลับBigDecimal ใหม่ ... " แทนที่จะเป็น "... จะส่งคืน BigDecimal ... " จะเป็นสิ่งที่ดี บางทีฉันแค่ nitpicking แต่ IMHO มีห้องพักสำหรับการปรับปรุงที่นี่ :-)
pauluss86

3
เพียงแค่สังเกตด้าน BigDecimal ไม่สมบูรณ์ไม่เปลี่ยนรูปที่จะไม่เป็นครั้งสุดท้ายเช่น String ...
Zai

@ Zai แต่นั่นเป็นเพียงข้อผิดพลาดในการใช้งานไม่ใช่ด้วยการออกแบบ รหัสบำรุงรักษาไม่ควรใช้ประโยชน์จากสิ่งนั้น
Chris Jester-Young

1
และทำไมการติดตั้ง Java จึงแปลกไปหน่อย?! ภาษาอื่น ๆ อีกมากมายใช้ + ระหว่างชนิดข้อมูลตัวเลข
sepehr

33

ดูเหมือนว่าจากเอกสาร Java ที่นี่ที่เพิ่มส่งกลับ BigDecimal ใหม่:

BigDecimal test = new BigDecimal(0);
System.out.println(test);
test = test.add(new BigDecimal(30));
System.out.println(test);
test = test.add(new BigDecimal(45));
System.out.println(test);

16
BigDecimal test = new BigDecimal(0);
System.out.println(test);
test = test.add(new BigDecimal(30));
System.out.println(test);
test = test.add(new BigDecimal(45));
System.out.println(test);

11

จริงๆแล้วมันค่อนข้างง่าย แค่ทำสิ่งนี้:

BigDecimal test = new BigDecimal(0);
System.out.println(test);
test = test.add(new BigDecimal(30));
System.out.println(test);
test = test.add(new BigDecimal(45));
System.out.println(test);

ดูสิ่งนี้ด้วย: BigDecimal#add(java.math.BigDecimal)


น่าสนใจว่าคำตอบของคุณเหมือนกับของ Maurice Perry หากคุณต้องการเพิ่มลิงค์คุณควรแก้ไขมัน
forresthopkinsa

อันที่จริงฉันไม่ได้คัดลอก แต่ฉันคิดว่าเราทั้งคู่เขียนคำตอบเดียวกันพร้อมกัน ฉันใช้เวลานานกว่านั้นในการค้นหาลิงก์ที่ถูกต้อง
nfechner

ว้าวมันน่าสนใจมาก!
forresthopkinsa

9

BigInteger ไม่เปลี่ยนรูปคุณต้องทำสิ่งนี้

  BigInteger sum = test.add(new BigInteger(30));  
  System.out.println(sum);

4
//you can do in this way...as BigDecimal is immutable so cant set values except in constructor

BigDecimal test = BigDecimal.ZERO;
BigDecimal result = test.add(new BigDecimal(30));
System.out.println(result);

result would be 30


2

คุณสามารถทำได้เช่นนี้:

BigDecimal A = new BigDecimal("10000000000");
BigDecimal B = new BigDecimal("20000000000");
BigDecimal C = new BigDecimal("30000000000");
BigDecimal resultSum = (A).add(B).add(C);
System.out.println("A+B+C= " + resultSum);

พิมพ์:

A + B + C = 60000000000


1

ใช้ lambdas Java8

List<BigDecimal> items = Arrays.asList(a, b, c, .....);

items.stream().filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);

สิ่งนี้ครอบคลุมกรณีที่วัตถุบางส่วนหรือทั้งหมดในรายการนั้นว่างเปล่า


0
BigDecimal demo = new BigDecimal(15);

มันเป็นสิ่งที่ไม่เปลี่ยนรูปเพราะมันจะเก็บข้อมูลภายในของคุณเช่น (15) final private final BigInteger intVal; และใช้แนวคิดเดียวกันในช่วงเวลาของการสร้างสตริงทุกการป้อนข้อมูลในที่สุดก็เก็บไว้ใน private final char value[];. ดังนั้นจึงไม่มีข้อผิดพลาดการฝัง


0

BigDecimalsเพียงแค่ตัวอย่างหนึ่งที่จะเพิ่ม จุดสำคัญคือพวกมันไม่เปลี่ยนรูปและสามารถเริ่มต้นได้เฉพาะในตัวสร้าง นี่คือรหัส:

import java.util.*;
import java.math.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc;
        boolean first_right_number = false;
        BigDecimal initBigDecimal = BigDecimal.ZERO;
        BigDecimal add1 = BigDecimal.ZERO;
        BigDecimal add2 = BigDecimal.ZERO;

        while (!first_right_number)
        {
            System.out.print("Enter a first single numeric value: ");
            sc = new Scanner(System.in);
            if (sc.hasNextBigDecimal()) 
            {
                first_right_number = true;
                add1 = sc.nextBigDecimal();
            }
        }

        boolean second_right_number = false;
        while (!second_right_number)
        {
            System.out.print("Enter a second single numeric value: ");
            sc = new Scanner(System.in);
            if (sc.hasNextBigDecimal()) 
            {
                second_right_number = true;
                add2 = sc.nextBigDecimal();
            }
        }
        BigDecimal result = initBigDecimal.add(add1).add(add2);
        System.out.println("Sum of the 2 numbers is: " + result.toString());
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.