2009-12-04 14 views
123

के लिए अतिरिक्त जोड़ें BigDecimal प्रकार में व्यक्त कुछ मुद्रा मानों के साथ मैं कुछ सरल रकम करना चाहता हूं।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 arithmetics, उत्पादन के पीछे देखते हैं।

Test 
0 
0 
0 

क्या कोई मेरी मदद कर सकता है?

उत्तर

214

तो आप ऐसा करने की जरूरत BigDecimal अपरिवर्तनीय है:

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

मैं समझ सकता यहाँ कोड है दुविधा। भले ही यह कहा गया है कि बिगडेसिमल अपरिवर्तनीय है, दस्तावेज़ीकरण बेहतर हो सकता है। उदाहरण के लिए, विधि 'जोड़ने के लिए दस्तावेज़ स्थिति' .. (:) ':" augend - मूल्य ** ** को जोड़ा जाएगा ** BigDecimal। "। इसके अलावा, "... एक ** नया ** BigDecimal ..." के बजाय "... एक BigDecimal देता है ..." एक अच्छा स्पर्श होगा। शायद मैं सिर्फ नाइटपिक कर रहा हूं, लेकिन आईएमएचओ में सुधार के लिए जगह है :-) – pauluss86

+3

बस एक साइड नोट, बिगडिसीमल पूरी तरह से अपरिवर्तनीय नहीं है क्योंकि यह स्ट्रिंग की तरह अंतिम नहीं है ... – Zai

+0

@Zai लेकिन यह केवल एक कार्यान्वयन बग है, डिजाइन द्वारा नहीं । रखरखाव कोड का फायदा नहीं उठाया जाना चाहिए। –

9

BigInteger अपरिवर्तनीय है, तो आप ऐसा करने की जरूरत है,

BigInteger sum = test.add(new BigInteger(30)); 
    System.out.println(sum); 
15
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); 
27

यह जावा डॉक्स here से की तरह दिखता है जो एक नया 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); 
10

यह वास्तव में आसान है। भी

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)

+0

दिलचस्प है कि आपका उत्तर मॉरीस पेरी के समान है। अगर आप लिंक जोड़ना चाहते हैं, तो आपको बस उसका संपादन करना चाहिए था। – forresthopkinsa

+0

दरअसल, मैंने इसकी प्रतिलिपि नहीं बनाई लेकिन मुझे लगता है कि हम दोनों एक ही समय में एक ही जवाब लिखते हैं (यह वैसे भी दिए गए कोड के लिए ठीक है)। मैंने सही लिंक देखने के लिए बस एक मिनट का समय लगाया। – nfechner

+0

वाह, यह बहुत दिलचस्प है! – forresthopkinsa

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 no = new BigDecimal(10); //you can add like this also 
no = no.add(new BigDecimal(10)); 
System.out.println(no); 

1
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()); 
    } 
} 
0

आप भी इस तरह यह कर सकते हैं:

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); 

प्रिंटों:

ए + बी + सी = 60000000000

संबंधित मुद्दे