Language/Java

โ˜• BigInteger & BigDecimal ์‚ฌ์šฉ๋ฒ• ๐Ÿ’ฏ ์ •๋ฆฌ

์ธํŒŒ_ 2022. 11. 12. 12:50

BigInteger-BigDecimal

BigInteger ์ž๋ฃŒํ˜•

 

BigInteger๋Š” ์–ธ์ œ ์‚ฌ์šฉ๋˜๋Š”๊ฐ€

Type ๋ฒ”์œ„
int -2,147,483,648 ~ 2,147,483,647
long -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

์ž๋ฐ”์˜ int๋Š” ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋Š” 4byte๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋Š” -2,147,483,648 ~ 2,147,483,647์ด๊ณ  long์€ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋Š” 8byte๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋Š” -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 ์ด๋‹ค.

๋ณด๊ธฐ์—” ์กฐ ๋‹จ์œ„๊ฐ€ ๋„˜๋Š” ์ปค๋‹ค๋ž€ ์ˆซ์ž์ด์ง€๋งŒ, ์šฐ์ฃผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜๊ณผ ๊ฐ™์€ ๋ฌดํ•œํ•œ ์ •์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ„ฑ ์—†์ด ๋ถ€์กฑํ•œ ๊ณต๊ฐ„์ด๋‹ค.

๋งŒ์ผ ์ด ํƒ€์ž…์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ๊ฒŒ ๋˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

 

๋”ฐ๋ผ์„œ ์ •์ˆ˜ํ˜• ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ๋ฐ˜๋“œ์‹œ ์ž์‹ ์ด ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ตœ์†Œ/์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ ํ•ด๋‹น ํƒ€์ž…์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋˜๋ฉด, ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(overflow)๊ฐ€ ๋ฐœ์ƒํ•ด ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฐ’์ด ์ €์žฅ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ : ํ•ด๋‹น ํƒ€์ž…์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” '์ตœ๋Œ€ ํ‘œํ˜„ ๋ฒ”์œ„'๋ณด๋‹ค ํฐ ์ˆ˜๋ฅผ ์ €์žฅํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ
  • ์–ธ๋”ํ”Œ๋กœ์šฐ : ํ•ด๋‹น ํƒ€์ž…์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” '์ตœ์†Œ ํ‘œํ˜„ ๋ฒ”์œ„'๋ณด๋‹ค ์ž‘์€ ์ˆ˜๋ฅผ ์ €์žฅํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ
byte max = 127;
byte min = -128;

System.out.println(max + 1000); // ERROR
System.out.println(min - 1000); // ERROR

์ž๋ฐ”์—์„œ byte ํƒ€์ž…์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์ˆ˜ ํฌ๊ธฐ ๋ฒ”์œ„๋Š” -128๋ถ€ํ„ฐ 127๊นŒ์ง€ ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ ์ฒ˜๋Ÿผ ๋ฐ”์ดํŠธ ํƒ€์ž…์˜ ๋ณ€์ˆ˜์— ํฌ๊ธฐ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ๋Š” ์—ฐ์‚ฐ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ, ์–ธ๋”ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๊ฐ€ ์ €์žฅ๋˜๊ฒŒ ๋œ๋‹ค.

 

๊ทธ๋ž˜์„œ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœํ• ๋•Œ ๋งŒ์ผ ์•„์ฃผ ํฐ ์ •์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ๊ณ ์ •๋œ ํƒ€์ž…๋ณด๋‹ค๋Š” ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” BigInteger์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

BigInteger ์ž๋ฃŒํ˜•์€ ๊ฑฐ์˜ ๋ฌดํ•œํ•œ ํฌ๊ธฐ์˜ ์ •์ˆ˜ํ˜• ์ˆซ์ž๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์ด๋‹ค. ๋ณด์•ˆ ๋ฐ ์•”ํ˜ธํ™” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋œ๋‹ค.


BigInteger ์‚ฌ์šฉ๋ฒ• 

 

BigInteger ์„ ์–ธ

๋งŒ์ผ long ํƒ€์ž…์ด ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ณด๋‹ค ๋” ํฐ ์ˆซ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด BigInteger ํด๋ž˜์Šค ํƒ€์ž…์„ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

๋จผ์ € BigInteger ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ๊ฐ€์žฅ ๋จผ์ € java.math ํŒจํ‚ค์ง€์—์„œ ํด๋ž˜์Šค๋ฅผ import ํ•ด์•ผ ๋œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ BigInteger์„ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌธ์ž์—ด์„ ์ธ์ž ๊ฐ’์œผ๋กœ ๋„˜๊ฒจ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋งŒ์ผ ์ˆซ์ž๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด valueOf static ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

import java.math.BigInteger; // BigInteger๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด math ํด๋ž˜์Šค๋ฅผ import ํ•ด์•ผ ๋œ๋‹ค.

// ๋ฌธ์ž์—ด๋กœ ์ƒ์„ฑ
BigInteger bigNumber = new BigInteger("10000");

// ์ˆซ์ž๋กœ ์ƒ์„ฑ
BigInteger bigInteger = BigInteger.valueOf(8871);

// n์ง„์ˆ˜๋กœ ์ƒ์„ฑ
BigInteger bigInteger = new BigInteger("FFFF", 16); // 16์ง„์ˆ˜
BigInteger bigInteger2 = new BigInteger("1011", 2); // 2์ง„์ˆ˜

 

BigInteger ํ˜• ๋ณ€ํ™˜

๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ด๋ฏธ ์žˆ๋Š” ์ˆซ์ž๊ฐ’๋“ค์„ ๊ฐ€์ ธ์™€ BigInterger ํƒ€์ž…์œผ๋กœ ํ˜• ๋ณ€ํ™˜๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

// int / long -> BigIntger
int num = 100000;
BigInteger bigNumber = BigInteger.valueOf(num); 

// BigIntger -> int
int int_bigNum = bigNumber.intValue(); 

// BigIntger -> long
long long_bigNum = bigNumber.longValue(); 

// BigIntger -> float
float float_bigNum = bigNumber.floatValue(); 

// BigIntger -> double
double double_bigNum = bigNumber.doubleValue(); 

// BigIntger -> String
String String_bigNum = bigNumber.toString();

 

BigInteger ์—ฐ์‚ฐ

BIgInteger ์ž๋ฃŒํ˜•์€ ํด๋ž˜์Šค ๊ตฌ์กฐ์ด๋ฉฐ ๋ฌธ์ž์—ด ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ +, -, * ๊ธฐํ˜ธ๋ฅผ ์ด์šฉํ•œ ์‚ฌ์น™์—ฐ์‚ฐ์„ ์ง์ ‘์ ์œผ๋กœ ํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ž˜์„œ BigInteger ํƒ€์ž…์˜ ์ˆซ์ž๋ฅผ ์—ฐ์‚ฐ์„ ํ•˜๋ ค๋ฉด ๋‚ด์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•˜์—ฌ ํ•ด์•ผํ•œ๋‹ค.

๋‚ด์žฅ ๋ฉ”์„œ๋“œ์—๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ add , substract , multiply , divide , compareTo ๋“ฑ์ด ์žˆ๋‹ค

BigInteger bigNumber1 = new BigInteger("100000");
BigInteger bigNumber2 = new BigInteger("10000");
		
System.out.println("๋ง์…ˆ(+) :" +bigNumber1.add(bigNumber2)); // ๋ง์…ˆ(+) :110000

System.out.println("๋บ„์…ˆ(-) :" +bigNumber1.subtract(bigNumber2)); // ๋บ„์…ˆ(-) :90000

System.out.println("๊ณฑ์…ˆ(*) :" +bigNumber1.multiply(bigNumber2)); // ๊ณฑ์…ˆ(*) :1000000000

System.out.println("๋‚˜๋ˆ—์…ˆ(/) :" +bigNumber1.divide(bigNumber2)); // ๋‚˜๋ˆ—์…ˆ(/) :10

System.out.println("๋‚˜๋จธ์ง€(%) :" +bigNumber1.remainder(bigNumber2)); // ๋‚˜๋จธ์ง€(%) :0
๋ฉ”์„œ๋“œ ์„ค  ๋ช…
BigInteger add(BigInteger val) ๋ง์…ˆ(this + val)
BigInteger subtract(BigInteger val) ๋บ„์…ˆ(this val)
BigInteger multiply(BigInteger val) ๊ณฑ์…ˆ(this * val)
BigInteger divide(BigInteger val) ๋‚˜๋ˆ—์…ˆ(this / val)
BigInteger remainder(BigInteger val) ๋‚˜๋จธ์ง€(this % val)

 

BigInteger ๋น„ํŠธ ์—ฐ์‚ฐ

BigInteger๋Š” ํฐ ์ˆซ์ž๋ฅผ ๋‹ค๋ฃจ๋Š” ๋Œ€์‹  ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๋ฏ€๋กœ, ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋น„ํŠธ๋‹จ์œ„๋กœ ์—ฐ์‚ฐํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค. 

BigInteger i = new BigInteger("1018"); // 2์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋ฉด : 1111111010(2)

int bitCount = i.bitCount(); // 1์˜ ๊ฐฏ์ˆ˜ : 8

int bitLength = i.bitLength(); // ๋น„ํŠธ ์ˆ˜ : 10

int getLowestSetBit = i.getLowestSetBit(); // 1

boolean testBit3 = i.testBit(3); // true

BigInteger setBit12 = i.setBit(12); // ์šฐ์ธก์—์„œ 13๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ 1๋กœ ๋ณ€๊ฒฝ → 1001111111010(2) → 5114

BigInteger flipBit0 = i.flipBit(0); // 1111111011(2) → 1019

BigInteger clearBit3 = i.clearBit(3); // 1111110010(2) → 1010
๋ฉ”์„œ๋“œ ์„ค  ๋ช…
int bitCount( ) 2์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ–ˆ์„ ๋•Œ, 1์˜ ๊ฐœ์ˆ˜(์Œ์ˆ˜๋Š” 0์˜ ๊ฐœ์ˆ˜)๋ฅผ ๋ฐ˜ํ™˜
int bitLength( ) 2์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ—€์„ ๋•Œ, ๊ฐ’์„ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ bit์ˆ˜
boolean testBit(int n) ์šฐ์ธก์—์„œ n + 1๋ฒˆ์งธ ๋น„ํŠธ๊ฐ€ 1์ด๋ฉด true, 0์ด๋ฉด false
BigInteger setBit(int n) ์šฐ์ธก์—์„œ n + 1๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ 1๋กœ ๋ณ€๊ฒฝ
BigInteger clearBit(int n) ์šฐ์ธก์—์„œ n + 1๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ 0์œผ๋กœ ๋ณ€๊ฒฝ
BigInteger flipBit(int n) ์šฐ์ธก์—์„œ n + 1๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ ์ „ํ™˜(1 → 0, 0 → 1)
BigInteger ํƒ€์ž…์˜ ์ˆซ์ž๊ฐ€ ์ •์ˆ˜๊ฐ€ ์ง์ˆ˜์ธ์ง€ ํ™€์ˆ˜ ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋ก , ์ œ์ผ ์˜ค๋ฅธ์ชฝ ๋น„ํŠธ๊ฐ€ 0์ผ ๊ฒƒ์ด๋ฏ€๋กœ, testBit(0) ์œผ๋กœ ๋งˆ์ง€๋ง‰ ๋น„ํŠธ๋ฅผ ํ™•์ธํ•˜๋Š” ์‹์œผ๋กœ ์‘์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋˜ํ•œ ๋น„ํŠธ ๋ผ๋ฆฌ and,  or,  xor,  not ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

BigInteger i = new BigInteger("17"); // 2์ง„์ˆ˜ : 10001(2)
BigInteger j = new BigInteger("7"); // 2์ง„์ˆ˜ : 111(2)

BigInteger and = i.and(j); // 10001(2) & 111(2) = 00001(2) → 1(10)

BigInteger or = i.or(j); // 23

BigInteger not = j.not(); // -8

BigInteger xor = i.xor(j); // 22

BigInteger andNot = i.andNot(j); // 16

BigInteger shiftLeft = i.shiftLeft(1); // 34

BigInteger shiftRight = i.shiftRight(1); // 8

 

BigInteger ์ˆซ์ž ๋น„๊ต

BigInteger์˜ ๊ฐ’์„ ๋น„๊ตํ•  ๋•Œ๋Š” compareTo ๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

BigInteger bigNumber1 = new BigInteger("100000");
BigInteger bigNumber2 = new BigInteger("1000000");
		
// ๋‘ ์ˆ˜ ๋น„๊ต compareTo ๋งž์œผ๋ฉด 0 / ํ‹€๋ฆฌ๋ฉด -1
int compare = bigNumber1.compareTo(bigNumber2);
System.out.println(compare); // -1

 

BigInteger ์ƒ์ˆ˜

์ฐธ๊ณ ๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ˆซ์ž 0,1,2,10์€ BigInteger.ZERO, BigInteger.ONE, BigInteger.TWO, BigInteger.TEN์œผ๋กœ ํด๋ž˜์Šค ์ƒ์ˆ˜๋กœ์„œ ์ œ๊ณตํ•œ๋‹ค.

๊ทธ๋ƒฅ ์ˆซ์ž๋ฅผ ์“ฐ๋ฉด ๋˜์ง€ ์ด๋Ÿฐ์‹์œผ๋กœ ํด๋ž˜์Šค ์ƒ์ˆ˜๋กœ ์ œ๊ณต๋˜๋Š” ์ด์œ ๋Š”, BigInteger ์—ฐ์‚ฐ์— ์žˆ์–ด ํŽธ๋ฆฌํ•จ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, ์–ด๋Š ์ˆซ์ž์— 10์„ ๊ณ„์‚ฐํ• ๋•Œ ์œ„์—์„œ ๋ฐฐ์šด๋Œ€๋กœ ๋ผ๋ฉด valueOf ๋กœ BigInteger ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜์„ ํ•ด์ฃผ๊ณ  ๊ณ„์‚ฐ์„ ํ•ด์•ผ๋˜์ง€๋งŒ ํด๋ž˜์Šค ์ƒ์ˆ˜๋กœ ๋ฐ”๋กœ๋ฐ”๋กœ ๊ณ„์‚ฐ์ด ๋จ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

System.out.println(BigInteger.ZERO); // 0
System.out.println(BigInteger.ONE); // 1
System.out.println(BigInteger.TWO); // 2
System.out.println(BigInteger.TEN); // 10

// ๋ณธ๋ž˜๋ผ๋ฉด ์ˆซ์ž 10์„ valueOf๋ฅผ ํ†ตํ•ด BigInteger ํด๋ž˜์Šค๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์—ฐ์‚ฐ์„ ํ•ด์•ผ๋˜์ง€๋งŒ, 
System.out.println(new BigInteger("20").add(BigInteger.valueOf(10))); // 30

// ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ˆซ์ž์ผ ๊ฒฝ์šฐ BigInteger ์ƒ์ˆ˜๋กœ ๋ฐ”๋กœ ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค
System.out.println(new BigInteger("20").add(BigInteger.TEN)); // 30

BigDecimal ์ž๋ฃŒํ˜•

 

BigDecimal๋Š” ์–ธ์ œ ์‚ฌ์šฉ๋˜๋Š”๊ฐ€

Type ๋ฒ”์œ„
float  1.4E-45 ~ 3.4028235E38
double 4.9E-324 ~ 1.7976931348623157E308

๋ถ€๋™ ์†Œ์ˆ˜์ ์„ ์ด์šฉํ•ด ์‹ค์ˆ˜ ๋„˜๋ฒ„๋ฅผ ์ €์žฅํ•˜๋Š”ํƒ€์ž…์ธ float๊ณผ double์€ ์†Œ์ˆ˜์ ์˜ ์ •๋ฐ€๋„๊ฐ€ ์™„๋ฒฝํ•˜์ง€ ์•Š๋Š” ๋‹ค๋Š” ํŠน์ง•์„ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์†Œ์ˆ˜์  ์ดํ•˜์˜ ์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์น™์—ฐ์‚ฐ ์‹œ ์ •ํ™•ํ•œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜๋ฅผ ์ €์žฅํ•  ๋•Œ ์ด์ง„์ˆ˜์˜ ๊ทผ์‚ฌ์น˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ปดํ“จํ„ฐ์˜ ์‹ค์ˆ˜์™€ ๋ถ€๋™์†Œ์ˆ˜์ ์˜ ํŠน์ง•์„ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค. (์ •๋ง ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜์˜€๋‹ค)

 

[JAVA] โ˜• ์‹ค์ˆ˜ ํ‘œํ˜„(๋ถ€๋™ ์†Œ์ˆ˜์ ) - ์›๋ฆฌ ํ•œ๋ˆˆ์— ์ดํ•ดํ•˜๊ธฐ

์‹ค์ˆ˜์˜ 2์ง„์ˆ˜ ํ‘œํ˜„ 10์ง„์ˆ˜์˜ ์ •์ˆ˜๋ฅผ 2์ง„์ˆ˜์˜ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด, 10์ง„์ˆ˜์˜ ์†Œ์ˆ˜๋ฅผ 2์ง„์ˆ˜์˜ ์†Œ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด 10์ง„์ˆ˜ 11.765625 ๋ฅผ 2์ง„์ˆ˜ ์†Œ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋จผ

inpa.tistory.com

 

double value1 = 12.23;
double value2 = 34.45;
 
// ๊ธฐ๋Œ€๊ฐ’ : 46.68
System.out.println(value1 + value2); // 46.68000000000001

์œ„์˜ ์ฝ”๋“œ์—์„œ 12.23์™€ 34.45์„ ๋”ํ–ˆ์œผ๋‹ˆ ๊ฒฐ๊ณผ๋กœ 46.68์„ ์˜ˆ์ƒํ–ˆ๊ฒ ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” 46.68000000000001๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ˆ˜์˜ ํฌ๊ธฐ๋กœ์„œ ๋ณด๋ฉด ์•„์ฃผ ์ž‘์€ ๊ทผ์‚ฌํ•œ ์ฐจ์ด๊ฒ ์ง€๋งŒ, ๊ธˆ์œต ๊ด€๋ จ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ด ์˜ค์ฐจ๊ฐ€ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. 

๊ทธ๋ ‡๊ธฐ์— ๋ฏธ์„ธํ•œ ์ˆซ์ž์˜ ๋ณ€๋™๋„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ํŠนํžˆ ๋ˆ๊ณผ ์†Œ์ˆ˜์ ์„ ๋‹ค๋ฃฌ๋‹ค๋ฉด BigDecimal์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

BigDecimal์€ ๊ณ„์‚ฐ ์†๋„๋Š” double , float์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ณด๋‹ค ์กฐ๊ธˆ ๋Š๋ฆฌ์ง€๋งŒ ์ •๋ฐ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•œ๋‹ค.


BigDecimal ์‚ฌ์šฉ๋ฒ•

 

BigDecimal ์„ ์–ธ

BigDecimal ํด๋ž˜์Šค๋Š” java.math ํŒจํ‚ค์ง€ ์•ˆ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. 

BigDecimal ์€ ์•ž์„œ๋ณธ BigInteger ์™€ ๋งค์šฐ ๋น„์Šทํ•œ ํ˜•ํƒœ์ž„์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฐจ์ด์ ์€ ์ •์ˆ˜๋ƒ ์‹ค์ˆ˜๋ƒ ์ด๋ผ๊ณ  ํ• ์ˆ˜ ์žˆ๋‹ค.

double, int, longํƒ€์ž…์œผ๋กœ๋„ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, double์˜ ์ •๋ฐ€๋„์˜ ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค ์ด๋ฏ€๋กœ doubleํƒ€์ž…์œผ๋กœ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ ์˜ค์ฐจ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ๋ž˜์„œ BigDecimal ์—ญ์‹œ BigInteger์ฒ˜๋Ÿผ ๋ณดํ†ต ๋ฌธ์ž์—ด๋กœ ์ƒ์„ฑํ•œ๋‹ค.

import java.math.BigDecimal; // BigDecimal ์‚ฌ์šฉํ•˜๋ ค๋ฉด math ํด๋ž˜์Šค๋ฅผ import ํ•ด์•ผ ๋œ๋‹ค.

// ๋ฌธ์ž์—ด๋กœ ์ƒ์„ฑ
BigDecimal bigDecimal = new BigDecimal("123.45678");

// double ํƒ€์ž…์œผ๋กœ ์ƒ์„ฑ(์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค) - ๋น„์ถ”์ฒœ
BigDecimal bigDecimal2 = new BigDecimal(123.456); // 123.4560000000000030695446184836328029632568359375

// valueOf ์ƒ์„ฑ
BigDecimal bigDecimal3 = BigDecimal.valueOf(123.456); // 123.456

// ์†Œ์ˆ˜์  ์•„๋ž˜์ž๋ฆฌ์ˆ˜ ์ง€์ •
BigDecimal bdFromLong2 = BigDecimal.valueOf(123412345678901L, 2); // 123412345678901 / 10^2 → 1234123456789.01

 

BigDecimal ํ˜• ๋ณ€ํ™˜

// double -> BigDecimal
BigDecimal bigDecimal = BigDecimal.valueOf(100000.12345); 

// BigDecimal -> int
int int_bigNum = bigDecimal.intValue(); 

// BigDecimal -> long
long long_bigNum = bigDecimal.longValue(); 

// BigDecimal -> float
float float_bigNum = bigDecimal.floatValue(); 

// BigDecimal -> double
double double_bigNum = bigDecimal.doubleValue(); 

// BigDecimal -> String
String String_bigNum = bigDecimal.toString();

 

BigDecimal ์—ฐ์‚ฐ

BigDecimal bigNumber1 = new BigDecimal("100000.12345");
BigDecimal bigNumber2 = new BigDecimal("10000");
				
System.out.println("๋ง์…ˆ(+) :" +bigNumber1.add(bigNumber2)); // ๋ง์…ˆ(+) :110000.12345

System.out.println("๋บ„์…ˆ(-) :" +bigNumber1.subtract(bigNumber2)); // ๋บ„์…ˆ(-) :90000.12345

System.out.println("๊ณฑ์…ˆ(*) :" +bigNumber1.multiply(bigNumber2)); // ๊ณฑ์…ˆ(*) :1000001234.50000

System.out.println("๋‚˜๋ˆ—์…ˆ(/) :" +bigNumber1.divide(bigNumber2)); // ๋‚˜๋ˆ—์…ˆ(/) :10.000012345

System.out.println("๋‚˜๋จธ์ง€(%) :" +bigNumber1.remainder(bigNumber2)); // ๋‚˜๋จธ์ง€(%) :0.12345
๋ฉ”์„œ๋“œ ์„ค  ๋ช…
BigDecimal add(BigDecimal val) ๋ง์…ˆ(this + vall)
BigDecimal subtract(BigDecimal val) ๋บ„์…ˆ(this - vall)
BigDecimal multiply(BigDecimal val) ๊ณฑ์…ˆ(this * vall)
BigDecimal divide(BigDecimal val) ๋‚˜๋ˆ—์…ˆ(this / vall)
BigDecimal remainder(BigDecimal val) ๋‚˜๋จธ์ง€(this % vall)

 

BigDecimal ์ˆซ์ž ๋น„๊ต

๋‘ ์ˆ˜๋ฅผ ๋น„๊ตํ•˜๋Š” compareTo ๋Š” ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ™์œผ๋ฉด 0 ๋‹ค๋ฅด๋ฉด -1 ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

BigDecimal bigNumber1 = new BigDecimal("100000.12345");
BigDecimal bigNumber2 = new BigDecimal("1000000.6789");

int compare = bigNumber1.compareTo(bigNumber2); //-1

 

BigDecimal ์ •๋ฐ€๋„ ๊ฐ’

BigDecimal ๋Š” ์‹ค์ˆ˜ ์ž๋ฃŒํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ฐ€๋„, ์Šค์ผ€์ผ, ๋ถ€ํ˜ธ ๊ฐ™์€ ์†์„ฑ์„ ์ถ”์ถœํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

BigDecimal bd = new BigDecimal("-12345.6789");

bd.precision(); // ์ •๋ฐ€๋„ : 9

bd.scale(); // ์ง€์ˆ˜๊ฐ’(์Šค์ผ€์ผ) : 4

bd.signum(); // ๋ถ€ํ˜ธ : -1(์Œ์ˆ˜)

 

BigDecimal ์ง€์ˆ˜(E) ์ œ๊ฑฐ

๊ฐ€๋” ์ปค๋‹ค๋ž€ ์‹ค์ˆ˜๊ฐ’์„ ๋‹ค๋ฃฐ๋–„, ์ง€์ˆ˜(E) ๋ถ€ํ˜ธ๊ฐ€ ๋ถ™์–ด์žˆ๋Š” ๊ฐ’์„ ๋‹ค๋ฃฐ๋•Œ๊ฐ€ ์žˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค๋ฉด 2000000์„ 2.0E7๋กœ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ์—ฐ์‚ฐ์— ์ด์šฉํ• ์ˆ˜๊ฐ€ ์—†์–ด์„œ ์ˆ˜๋™ ์ˆซ์ž ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋‹ค.

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ๋ฒ•์œผ๋กœ๋Š”, ์šฐ์„  Double๋กœ ํŒŒ์‹ฑ์„ ํ•œ ๋’ค, new BigDecimal ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์ฃผ๋ฉด ๋œ๋‹ค.

String str = "1.0E7"

BigDecimal b = new BigDecimal(str); // ์ง€์ˆ˜ ๋ถ™์Œ
System.out.println(b); // 1.0E+7

BigDecimal b2 = new BigDecimal(Double.parseDouble(str)); // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ง€์ˆ˜ ์•ˆ๋ถ™์Œ
System.out.println(b2); // 10000000

BigDecimal ๋ฐ˜์˜ฌ๋ฆผ ์ •์ฑ…

 

java.lang.ArithmeticException

BigDecimal ํƒ€์ž…์˜ ์‹ค์ˆ˜๋Š” divide ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚˜๋ˆ—์…ˆ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์ฃผ์˜ํ•ด์•ผ ํ• ์ ์€, ์‹ค์ˆ˜ ๋‚˜๋ˆ—์…ˆ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ๋‚˜๋ˆ„์–ด ๋ชซ์ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ์ˆ˜์˜ ๊ฒฝ์šฐ java.lang.ArithmeticException ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค๋Š” ์ ์ด๋‹ค.

BigDecimal value1 = new BigDecimal("11");
BigDecimal value2 = BigDecimal.valueOf(3);

// Exception in thread "main" java.lang.ArithmeticException:
// Non-terminating decimal expansion; no exact representable decimal result.
value1.divide(value2); // 3.666666666666666666666...

๋”ฐ๋ผ์„œ BigDecimal ์˜ ๋‚˜๋ˆ—์…ˆ์€ ๋ณด๋‹ค ์ •ํ™•ํ•œ ๊ณ„์‚ฐ์„ ์œ„ํ•ด์„œ๋Š” ์†Œ์ˆ˜์  ๋ช‡ ๋ฒˆ์งธ์งœ๋ฆฌ๊นŒ์ง€, ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ์ง€์ •์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

BigDecimal value1 = new BigDecimal("11");
BigDecimal value2 = BigDecimal.valueOf(3);

// divide()์˜ 2๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” N ๋ฒˆ์งธ ์ž๋ฆฌ๊นŒ์ง€ ํ‘œํ˜„ํ•  ๊ฒƒ์ธ๊ฐ€๋ฅผ ๋œปํ•˜๊ณ , 3๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฐ˜์˜ฌ๋ฆผ ์ •์ฑ… ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด๋‹ค. 
// ์†Œ์ˆ˜์  3๋ฒˆ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ 2๋ฒˆ์งธ ์ž๋ฆฌ๊นŒ์ง€ ํ‘œ๊ธฐํ•œ๋‹ค.
value1.divide(value2, 2, RoundingMode.HALF_EVEN); // 3.67

 

BigDecimal - RoundingMode

์œ„์˜ ์ฝ”๋“œ์—์„œ ๋ฐ˜์˜ฌ๋ฆผ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•ด RoundingMode.HALF_EVEN ๋ผ๋Š” ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ด๊ฒƒ์ด ๋ฐ˜์˜ฌ๋ฆผ ์ •์ฑ…์ด๋‹ค.

์ž๋ฐ”์—์„œ๋Š” BigDecimal ํด๋ž˜์Šค์— ๋‹ค์–‘ํ•œ ์†Œ์ˆ˜์  ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

์•„๋ฌด๋ž˜๋„ ๋ถ€๋™์†Œ์ˆ˜์ ์˜ ์‹ค์ˆ˜๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ ์žˆ์–ด ๋ถ€์ •ํ™•ํ•œ ์‹ค์ˆ˜ ์—ฐ์‚ฐ๊ฐ’์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜์˜ฌ๋ฆผ์„ ๋ช…ํ™•ํžˆ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฏธ๊ตญ ์—ฐ๋ฐฉ ์„ธ๊ธˆ ํ™˜๊ธ‰์€ RoundingMode.HALF_UP์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ๋‹ฌ๋Ÿฌ ๊ธˆ์•ก์œผ๋กœ ๋ฐ˜์˜ฌ๋ฆผํ•˜๋„๋ก ์ง€์ •ํ•œ๋‹ค.

์ƒ์ˆ˜ ์„ค  ๋ช…
RoundingMode.CEILING ์˜ฌ๋ฆผ
RoundingMode.FLOOR ๋‚ด๋ฆผ
RoundingMode.UP ์–‘์ˆ˜์ผ๋•Œ๋Š” ์˜ฌ๋ฆผ, ์Œ์ˆ˜์ผ ๋•Œ๋Š” ๋‚ด๋ฆผ
RoundingMode.DOWN  UP ๊ณผ ๋ฐ˜๋Œ€๋กœ ์–‘์ˆ˜์ผ ๋•Œ๋Š” ๋‚ด๋ฆผ, ์Œ์ˆ˜์ผ ๋•Œ๋Š” ์˜ฌ๋ฆผ
RoundingMode.HALF_UP ๋ฐ˜์˜ฌ๋ฆผ(5์ด์ƒ ์˜ฌ๋ฆผ, 5๋ฏธ๋งŒ ๋ฒ„๋ฆผ)
RoundingMode.HALF_EVEN ๋ฐ˜์˜ฌ๋ฆผ(๋ฐ˜์˜ฌ๋ฆผ ์ž๋ฆฌ์˜ ๊ฐ’์ด ์ง์ˆ˜๋ฉด  HALF_DOWN , ํ™€์ˆ˜๋ฉด  HALF_UP )
RoundingMode.HALF_DOWN ๋ฐ˜์˜ฌ๋ฆผ(6์ด์ƒ ์˜ฌ๋ฆผ, 6๋ฏธ๋งŒ ๋ฒ„๋ฆผ)
RoundingMode.UNNECESSARY ๋‚˜๋ˆ—์…ˆ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋”ฑ ๋–จ์–ด์ง€๋Š” ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉด,  ArithmeticException ๋ฐœ์ƒ

 

์‚ฌ์šฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

divide() ๋ฉ”์†Œ๋“œ์— ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ๋Š” ์‹ค์ˆ˜๊ฐ’์„, ๋‘๋ฒˆ์งธ๋Š” ์†Œ์ˆ˜์  ๋ช‡์ž๋ฆฌ ์ง€์ •, ์„ธ๋ฒˆ์งธ๋Š” ๋ฐ˜์˜ฌ๋ฆผ ์ •์ฑ…์„ ์ง€์ •ํ•œ๋‹ค.

๋ฐ˜๋“œ์‹œ ์ธ์ˆ˜ 3๊ฐœ๋ฅผ ์ ์„ ํ•„์š”๋Š” ์—†์œผ๋ฉฐ ์ž์œ ๋กญ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

BigDecimal divide(BigDecimal num, int scale(์†Œ์ˆ˜์  ๋ช‡์ž๋ฆฌ), RoundingMode roundingMode)
BigDecimal b10 = new BigDecimal("10");
BigDecimal b3 = new BigDecimal("3");

// ๋‚˜๋ˆ„๊ธฐ ๊ฒฐ๊ณผ๊ฐ€ ๋ฌดํ•œ์œผ๋กœ ๋–จ์–ด์ง€๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ
b10.divide(b3);// 3.3333333333333...  java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

// ๋ฐ˜์˜ฌ๋ฆผ ์ •์ฑ…์„ ๋ช…์‹œํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
b10.divide(b3, RoundingMode.HALF_EVEN); // 3

// ๋ฐ˜์˜ฌ๋ฆผ ์ž๋ฆฌ๊ฐ’์„ ๋ช…์‹œ
b10.divide(b3, 6, RoundingMode.HALF_EVEN); // 3.333333
b10.divide(b3, 9, RoundingMode.HALF_EVEN); // 3.333333333

 

ํ˜น์€ ์—ฐ์‚ฐ๊ฐ’์ด ์•„๋‹Œ ๊ณ ์ •๋œ ์‹ค์ˆ˜์— ๋Œ€ํ•ด์„œ๋„ setScale() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ˜์˜ฌ๋ฆผ ์ •์ฑ…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

BigDecimal setScale(int newScale, RoundingMode mode)
// ์†Œ์ˆ˜์  ์ฒซ ๋ฒˆ์งธ๊นŒ์ง€ ํ‘œํ˜„, ๋‘๋ฒˆ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผ
BigDecimal.valueOf(12.35).setScale(1, RoundingMode.HALF_UP); // 12.4

// ์†Œ์ˆ˜์  ์ดํ•˜ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  ์˜ฌ๋ฆผ
BigDecimal.valueOf(12.34).setScale(0, RoundingMode.CEILING); // 13

// ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ๋Š” ํŠน์ • ์ž๋ฆฟ์ˆ˜ ์ดํ•˜ ์ œ๊ฑฐ
BigDecimal.valueOf(-12.34).setScale(1, RoundingMode.CEILING); // -12.3

// ํŠน์ • ์ž๋ฆฟ์ˆ˜ ์ดํ•˜ ๋ฒ„๋ฆผ
new BigDecimal("12.37").setScale(1, RoundingMode.FLOOR); // 12.3

 

BigDecimal - MathContext

๋ฐ˜์˜ฌ๋ฆผ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š”๋ฐ RoundingMode ์™€ ๊ฐ™์ด MathContext ํด๋ž˜์Šค๋„ ์กด์žฌํ•œ๋‹ค.

MathContext๋Š” ๋ฐ˜์˜ฌ๋ฆผ ๋ชจ๋“œ์™€ ์ •๋ฐ€๋„(precision)๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด๋†“์€ ๊ฒƒ์ผ ๋ฟ์ธ ํด๋ž˜์Šค์ด๋‹ค.

์ƒ์ˆ˜ ์„ค  ๋ช…
MathContext.DECIMAL32  7์ž๋ฆฌ ์ •๋ฐ€๋„ ๋ฐ HALF_EVEN์˜ ๋ฐ˜์˜ฌ๋ฆผ ๋ชจ๋“œ
MathContext.DECIMAL64 16์ž๋ฆฌ ์ •๋ฐ€๋„ ๋ฐ HALF_EVEN์˜ ๋ฐ˜์˜ฌ๋ฆผ ๋ชจ๋“œ
MathContext.DECIMAL128 34์ž๋ฆฌ ์ •๋ฐ€๋„ ๋ฐ HALF_EVEN์˜ ๋ฐ˜์˜ฌ๋ฆผ ๋ชจ๋“œ
MathContext.UNLIMITED ๋ฌด์ œํ•œ ์ •๋ฐ€ ์‚ฐ์ˆ 
BigDecimal b10 = new BigDecimal("10");
BigDecimal b3 = new BigDecimal("3");

// ์ „์ฒด ์ž๋ฆฌ์ˆ˜๋ฅผ 7๊ฐœ๋กœ ์ œํ•œํ•˜๊ณ  HALF_EVEN ๋ฐ˜์˜ฌ๋ฆผ์„ ์ ์šฉํ•œ๋‹ค.
b10.divide(b3, MathContext.DECIMAL32); // 3.333333

// ์ „์ฒด ์ž๋ฆฌ์ˆ˜๋ฅผ 16๊ฐœ๋กœ ์ œํ•œํ•˜๊ณ  HALF_EVEN ๋ฐ˜์˜ฌ๋ฆผ์„ ์ ์šฉํ•œ๋‹ค.
b10.divide(b3, MathContext.DECIMAL64); // 3.333333333333333

// ์ „์ฒด ์ž๋ฆฌ์ˆ˜๋ฅผ 34๊ฐœ๋กœ ์ œํ•œํ•˜๊ณ  HALF_EVEN ๋ฐ˜์˜ฌ๋ฆผ์„ ์ ์šฉํ•œ๋‹ค.
b10.divide(b3, MathContext.DECIMAL128); // 3.333333333333333333333333333333333

// ์ „์ฒด ์ž๋ฆฌ์ˆ˜๋ฅผ ์ œํ•œํ•˜์ง€ ์•Š๋Š”๋‹ค.
b10.divide(b3, MathContext.UNLIMITED); // java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

# ์ฐธ๊ณ ์ž๋ฃŒ

https://www.baeldung.com/java-bigdecimal-biginteger

https://jsonobject.tistory.com/466