์ด๋ฒ ๋ฏธ์
์์ BigDecimal
์ ๋ํ ์ธ๊ธ์ด ๋ง์๋๋ฐ,
๋๋์ฒด ๊ทธ๊ฒ ๋ญ์ง ๐คทโโ๏ธ ๋๋ง ๋ชฐ๋ผ โ
์์๋ถํฐ ์ถ๋ฐํ BigDecimal์ ๋ํ ๊ณ ์ฐฐ ~
์ด๋ฒ์ฃผ ํ๊ณ ์์ ์์ผ๋ก ํฌ์คํ
์ ๋ด๊ฐ ์ดํดํ ๊ธ์ ์ค๋ช
ํ๋ฏ์ด ! ์์ฑํ๊ธฐ๋ก ๋ค์งํ
๋ด์ฉ์ ์ต๋ํ ๋ฐ์ํ๋ ค๊ณ ๋
ธ๋ ฅ์ค โ๏ธ
๋๊ตฐ๊ฐ ์ด ๊ธ์ ์ฝ๊ณ ์๋ค๋ฉด ์ ์๊ฐ ์ด๋ฐ์ง์ ํ๊ณ ์๊ตฌ๋ ๊ฐ๋ณ๊ฒ ๋ด์ฃผ๊ธธ ใ
ใ
๐
BigDecimal์ ์ ์ฐ์ง ?
Test
๊ณผ์ฐ ์ ํ ์คํธ ์ผ์ด์ค๋ ํต๊ณผ๋ฅผ ํ ๊น? ์ ๋ต์ ๐
ํํ ์ด์ด์๊ฒ๋ ์คํจํฉ๋๋ค.
์ ์คํจํ๋๊ตฌ์ ?
์๋ฐ๋ IEEE 754 ๋ถ๋ ์์์ ๋ฐฉ์์ ์ฌ์ฉํด์,
์ ํํ ์ค์๋ฅผ ์ ์ฅํ์ง ์๊ณ ์ต๋ํ ์๋ฒฝ์ ๊ฐ๊น๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๊ทผ์ฌ์น ๊ฐ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค !
์ง๊ธ์ ๋จ์ํ ๊ฐ๋ฐ์ ํ๋๊ฐ ํ
์คํธ๋ฅผ ์ํด ์์ฑํ ์ฝ๋์ด์ง๋ง,
๊ธ์ต๊ถ์์ ๋ฌ๋ฌ๋ฅผ ๋ค๋ฃจ๋ ๊ฐ๋ฐ์๊ฐ double์ ์ด์ฉํด์ ์ด๋ฐ ์ฌ์ํ ๊ฐ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ค๋ฉด ๐
๊ทธ๋ ๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋๋ !
์ฐ๋ฆฌ์๊ฒ ๋ถ๋ ์์ซ์ ๋ฐฉ์์ด ์๋, ์ ์๋ฅผ ์ด์ฉํด ์ค์๋ฅผ ํํํ๋ java.math.BigDecimal
ํด๋์ค๊ฐ ์๋ค.
Java ์ธ์ด์์ ๋๊ณผ ์์์ ์ ๋ค๋ฃฌ๋ค๋ฉด BigDecimal์ ์ ํ์ด ์๋๋ผ ํ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ณธ๊ฒฉ์ ์ผ๋ก BigDecimal์ ํด๋ถํด ๋ด ์๋ค.
BigDecimal ํด๋์ค
BigDecimal
ํด๋์ค์ ์ผ๋ถ๋ฅผ ๊ฐ์ ธ์๋ค.
์ฌ๊ธฐ์ ๊ฐ๋จํ๊ฒ ๋ช ๊ฐ์ง ๋ณ์๋ค์ ์ฐ์ ์ง๊ณ ๋์ด๊ฐ๊ฒ ๋ค.
์ฐธ๊ณ ๋ก BigDecimal์ ๋ถ๋ณ ํด๋์ค์
๋ณ์
- intValue : ์ ์. ์ ์๋ฅผ ์ ์ฅํ๋๋ฐ
BigInteger
๋ฅผ ์ฌ์ฉํ๋ค. - scale : ์ง์. ์ ํํ๋ ์์์ ์ฒซ์งธ ์๋ฆฌ๋ถํฐ 0์ด ์๋ ์๋ก ๋๋๋ ์์น๊น์ง์ ์ด ์์์ ์๋ฆฌ์์ด๋ค.
- precision : ์ ๋ฐ๋. ์ ํํ๋ 0์ด ์๋ ์๊ฐ ์์ํ๋ ์์น๋ถํฐ ์ค๋ฅธ์ชฝ๋ถํฐ 0์ด ์๋ ์๋ก ๋๋๋ ์์น๊น์ง์ ์ด ์๋ฆฌ์์ด๋ค. ์๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ก ๊ฐ ๋ณ์์ ์๋ฏธ๋ฅผ ํ์ ํ์.
BigDecimal์ ์์ฑ
BigDecimal์ ์์ฑ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ,
๋ฌธ์์ด๋ก ์ซ์๋ฅผ ํํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
๊ธฐ๋ณธํ ๋ฆฌํฐ๋ด๋ก๋ ํํํ ์ ์๋ ๊ฐ์ ํ๊ณ๊ฐ ์๋๋ฐ, ์๋ฅผ ๋ค์ด
double ํ์
์ ๊ฐ์ ๊ทธ๋๋ก ์ ๋ฌํ ๊ฒฝ์ฐ
์์ ์ฌ์น์ฐ์ฐ ๊ฒฐ๊ณผ์์ ๋ณธ ๊ฒ๊ณผ ๊ฐ์ด ์์๊ณผ ๋ค๋ฅธ ๊ฐ์ ์ป์ ์๋ ์๋ค.
BigDecimal val;
val = new BigDecimal("12345.6789");
val = new BigDecimal(12345.678); // ์ค์ฐจ๊ฐ ๋ ์ ์์
val = new BigDecimal(12345);
val = BigDecimal.valueOf(12345.67); // ์ค์ฐจ๊ฐ ๋ ์ ์์
val = BigDecimal.valueOf(123456);
์ค์ ๋ก ์ธํ ๋ฆฌ์ ์ด๋ String์ผ๋ก ๋ฐ๊พธ๋ผ๊ณ ์๋ ค์ค๋ค ๐ ๋๋์ด
BigDecimal์ ๋น๊ต
BigDecimal์ Comparable<BigDecimal>
๋ฅผ ๊ตฌํํ๊ณ ์๊ธฐ ๋๋ฌธ์,
equals()
๋ฅผ ํตํด ๋ด์ฉ์ ๋น๊ตํ ์ ์๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ 12.01
๊ณผ 12.010
์ ๊ฐ์ง ์๋ค.
BigDecimal์ ํ์ ๋ณํ
๋ฌธ์์ด๋ก ๋ณํ
String toPlainString(); // ๋ฌด์กฐ๊ฑด ๋ค๋ฅธ ๊ธฐํธ ์์ด ์ซ์๋ก๋ง ํํ
String toString(); // ํ์์ ์ง์ ํํ๋ก ํํํ ์๋ ์์
๋ Number
๋ฅผ ์์๋ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ Number
์ ๊ธฐ๋ณธํ์ผ๋ก ๋ณํํ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
int intValue()
long longValue()
float floatValue()
double doubleValue()
๋ BigDecimal์ ์ ์ํ์ผ๋ก ๋ณํํ๋ ๋ฉ์๋ ์ค,
์ด๋ฆ ๋์ Exact
๊ฐ ๋ถ์ ๊ฒ์ ๋ณํ ๊ฒฐ๊ณผ๊ฐ ๋ณํ ํ์
๋ฒ์์ ์ํ์ง ์์ผ๋ฉด
ArithmeticException
์ ๋ฐ์์ํจ๋ค.
ํ ์คํธ ์ฑ๊ณต !
BigDecimal์ ์ฐ์ฐ
๋จผ์ ๊ธฐ๋ณธ์ ์ธ ์ฐ์ฐ์ ์ํํ๋ ๋ฉ์๋๋ค์ด๋ค.
BigDecimal add(BigDecimal val)
BigDecimal subtract(BigDecimal val)
BigDecimal multiply(BigDecimal val)
BigDecimal divide(BigDecimal val)
BigDecimal remainder(BigDecimal val)
ํ ์คํธ ์ฑ๊ณต !
์ฐธ๊ณ ๋ก BigDecimal์ ๋ถ๋ณ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์ฐ์ฐ ํ ๋ฐํ ํ์ ์ด BigDecimal์ธ ๊ฒฝ์ฐ ์๋ก์ด ์ธ์คํด์ค๊ฐ ๋ฐํ๋๋ค.
์ถ๊ฐ๋ก ๋ค๋ฅธ ์ฐ์ฐ๊ณผ ๋ฌ๋ฆฌ divide()
์ ๋ฉ์๋๊ฐ ๋ค์ํ ๋ฒ์ ์ผ๋ก ์ค๋ฒ๋ก๋ฉ ๋์ด์๋ค.
์ด๋ป๊ฒ ๋ฐ์ฌ๋ฆผํ ์ง(roundingMode), ๋ช ๋ฒ์งธ ์๋ฆฌ(scale)์์ ๋ฐ์ฌ๋ฆผ ํ ๊ฑด์ง๋ฅผ ์ง์ ํ ์ ์๋ค.
roundingMode
๋ฐ์ฌ๋ฆผ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ํ ๊ฒ์ผ๋ก BigDecimal์ ์ ์๋ ๋ค์ ์์๋ค์์ ํ๋๋ฅผ ์ ํํด ์ฌ์ฉํ๋ฉด ๋๋ค.
- CEILING โ ์ฌ๋ฆผ
- FLOOR โ ๋ด๋ฆผ
- UP โ ์์์ผ ๊ฒฝ์ฐ ์ฌ๋ฆผ, ์์์ผ ๊ฒฝ์ฐ ๋ด๋ฆผ
- DOWN โ ์์์ผ ๊ฒฝ์ฐ ๋ด๋ฆผ, ์์์ผ ๊ฒฝ์ฐ ์ฌ๋ฆผ
- HALF_UP โ ๋ฐ์ฌ๋ฆผ(5์ด์ ์ฌ๋ฆผ, 5๋ฏธ๋ง ๋ฒ๋ฆผ)
- HALF_EVEN โ ๋ฐ์ฌ๋ฆผ(๋ฐ์ฌ๋ฆผ ์๋ฆฌ์ ๊ฐ์ด ์ง์๋ฉด HALF_DOWN, ํ์๋ฉด HALF_UP)
- HALF_DOWN โ ๋ฐ์ฌ๋ฆผ(6์ด์ ์ฌ๋ฆผ, 6๋ฏธ๋ง ๋ฒ๋ฆผ)
- UNNECESSARY โ ๋๋์
๊ฒฐ๊ณผ๊ฐ ๋ฑ ๋จ์ด์ง์ง ์์ผ๋ฉด,
ArithmeticException
๋ฐ์
scale ๋ณ๊ฒฝ
์์์ ์์น๋ฅผ ๋ฐ๊พธ๊ณ ์ถ์ ๋๋ BigDecimal์ 10์ผ๋ก ๊ณฑํ๊ฑฐ๋ ๋๋๋ ๊ฒ์ด ์๋๋ผ,
setScale()
์ ํตํด scale ๊ฐ์ ๋ณ๊ฒฝํ๋ค.
BigDecimal setScale(int newScale)
BigDecimal setScale(int newScale, int roundingMode)
BigDecimal setScale(int newScale, RounfingMode mode)
์ฃผ์ํ ์ ์ setScale()
๋ก scale์ ์ค์ด๋ ๊ฒ์ 10์ n์ ๊ณฑ์ผ๋ก ๋๋๋ ๊ฒ๊ณผ ๊ฐ์ผ๋ฏ๋ก
์ค์ฐจ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ roundingMode๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์ข๋ค.
์์ฑ์ ๋์ valueOf()๋ฅผ ์ฌ์ฉํด๋ผ !
์ด ๋ถ๋ถ์ ๊ฐ์ธ์ ์ธ ๊ณ ์ฐฐ์ด๋ ํน์๋ ์ด ๊ธ์ ๋๊ตฐ๊ฐ ์ฝ๊ณ ์๋ชป๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ๋ฐ๋ฐ ๋ถํ๋๋ฆผ๋ค ๐
BigDecimal์ ์์ฑ์์ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋์ธ valueOf()
๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋๋ฐ,
๊ณผ์ฐ ๋ ๊ฐ๋ ์ด๋ค ๊ฒ์ด ๋ค๋ฅผ๊น โ
๊ณ ๊ฒ์ด ๊ถ๊ธํด์ก๋ค.
์ผ๋จ BigDecimal์ Integerํด๋์ค์ฒ๋ผ ์ผ๋ถ ๊ฐ์ ์บ์ฑํด ๋๊ณ ์๋ค.
์์ผ๊น ์ค์ค๋ก ๋ต์ ํด๋ณด์๋๋ฐ,
BigDecimal์ ์ฃผ์์ฑ์๋ฅผ ๊ฐ๋ณด๋ฉด,
์ ๋ง ์ฅํฉํ ์์ฑ์๋ฅผ ๋ณผ ์ ์๋ค.
๋๋ฌธ์ BigDecimal์ด ์ฑ๋ฅ์ด ๋๋ฆฌ๋ค๊ณ ๋ ํ๋๋ฐ,
๋ด ์๊ฐ์๋ ์ด๋ฌํ ์ด์ ๋๋ฌธ์๋ ์บ์ฑ์ ํด๋
ผ๊ฒ ์๋๊ฐ ์ถ๋ค.
์ด์ฏค์์ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋์ธvalueOf()
๋ก ๊ฐ๋ณด๋ฉด,
์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ static ๋ณ์์ธ ์บ์ฑ ๊ฐ์ ๋ฐ๋ก ์ ๊ทผํ ์ ์๋ค.
๋๋ฌธ์ ์ด๋ฏธ ์บ์ฑ๋์ด ์๋ ๊ฐ์ด ์กด์ฌํ๋ค๋ฉด ์์ฑ์๋ฅผ ํตํ์ง ์๊ณ ๊ทธ ๊ฐ์ ๋ฐ๋ก ๋ฐํํ๋ค.
โ
๋ ์ถ๊ฐ๋ก
double์ค์๊ฐ์ ์์ฑ์๋ก ์์ฑํด๋ ์ฐ์ฐ๊ฒฐ๊ณผ๊ฐ ์ ํํ์ง ์์ ์ ์์ผ๋,
valueOf()
๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๋ ๊ฒ์ด ์ข๋ค๊ณ ๋ ํ๋ค.
์คํธ๋ผ ๐
์์ฆ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋์ ์บ์ฑ๊ฐ๋
๋ค์ ๋ํด ์ดํด๋ดค๋๋ฐ,
BigDecimal์ ๋ฏ์ด๋ณด๋ ๊ต์ฅํ ํฅ๋ฏธ๋กญ๋ค ๐ป