๐Ÿ“– BigDecimal์— ๊ด€ํ•œ ๊ณ ์ฐฐ


์ด๋ฒˆ ๋ฏธ์…˜์—์„œ 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์„ ๋œฏ์–ด๋ณด๋‹ˆ ๊ต‰์žฅํžˆ ํฅ๋ฏธ๋กญ๋‹ค ๐Ÿ‘ป