โ 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์ ์์์ ์ ์ ๋ฐ๋๊ฐ ์๋ฒฝํ์ง ์๋ ๋ค๋ ํน์ง์ ์ง๋๊ณ ์๋ค.
๊ทธ๋์ ์์์ ์ดํ์ ์๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์น์ฐ์ฐ ์ ์ ํํ ๊ฐ์ ์ถ๋ ฅํ์ง ์๊ฒ ๋๋ค. ์๋ํ๋ฉด ๋ด๋ถ์ ์ผ๋ก ์๋ฅผ ์ ์ฅํ ๋ ์ด์ง์์ ๊ทผ์ฌ์น๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ปดํจํฐ์ ์ค์์ ๋ถ๋์์์ ์ ํน์ง์ ์์ธํ ์์๋ณด๊ณ ์ถ๋ค๋ฉด ๋ค์ ํฌ์คํ ์ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค. (์ ๋ง ์ฝ๊ฒ ์ค๋ช ํ์๋ค)
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