[TIL] 2025-01-14_BigDecimal

Yuriยท2025๋…„ 1์›” 14์ผ

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
28/59

๐Ÿ”ซ ํ‚ค์˜ค์Šคํฌ ๊ณผ์ œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ ๊ฒช์€ ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•, ์ƒˆ๋กœ ์•Œ๊ฒŒ๋œ ์ ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๋งค๋ฒˆ ์Šต๊ด€์ฒ˜๋Ÿผ Double ๋Œ€์‹  BigDecimal์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ทธ ์ด์œ ๋ฅผ ํ™•์‹คํžˆ ์ •๋ฆฌํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ ์ด๋ฒˆ ๊ณผ์ œ์—์„œ stream์œผ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ๋ฐ˜ํ™˜๋ฐ›์€ ๊ฒฐ๊ด๊ฐ’์— ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ด๋ฒˆ ๊ธฐํšŒ์— ์†Œ์ˆ˜์  ์—ฐ์‚ฐ์—์„œ ์™œ BigDecimal์„ ์จ์•ผ ํ•˜๋Š”์ง€ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

๋ฌธ์ œ์ 

์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ๋ชจ๋“  ๋ฉ”๋‰ด์˜ ์ด ๊ธˆ์•ก์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์„œ๋“œ getTotalPrice()๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹คํ–‰

public double getTotalPrice() {
    return cartItems.entrySet().stream()
                .mapToDouble(i -> i.getKey().getPrice() * i.getValue())
                .sum();
}

13.8 + 8.9 = 22.7 ์ธ๋ฐ, ์ฝ˜์†”์— ์ถœ๋ ฅ๋œ ์ด ๊ธˆ์•ก์€ 22.700000000000003 ์œผ๋กœ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.
๐Ÿค” ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์›์ธ์ด ๋ฌด์—‡์ผ๊นŒ?

์›์ธ

  • ์‹ค์ˆ˜ ์ž๋ฃŒํ˜•
    • float : ๋Œ€๋žต -3.4E38 ~ 3.4E38, 7์ž๋ฆฌ ์ •๋ฐ€๋„ (4byte, 2ยณยฒ)
    • double : ๋Œ€๋žต -1.7E308 ~ 1.7E308, 15์ž๋ฆฌ ์ •๋ฐ€๋„ (8byte, 2โถโด)

์˜ค์ฐจ๋Š” ์‹ค์ˆ˜ ์ž๋ฃŒํ˜•์˜ ๋ถ€๋™์†Œ์ˆ˜์  ํ‘œํ˜„์œผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค.

๊ณ ์ •์†Œ์ˆ˜์ (fixed point)
์ •์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋น„ํŠธ์™€ ์†Œ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋น„ํŠธ ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ๊ณ ์ •ํ•˜๊ณ  ํ•ด๋‹น ๋น„ํŠธ๋งŒ์„ ํ™œ์šฉํ•˜์—ฌ ์‹ค์ˆ˜๋ฅผ ํ‘œํ˜„

๋ถ€๋™์†Œ์ˆ˜์ (floating point, ๆตฎๅ‹•)
'์†Œ์ˆ˜์ ์ด ๋– ์„œ ์›€์ง์ธ๋‹ค.' โ†’ ์†Œ์ˆ˜์ ์ด ์˜ฎ๊ฒจ๋‹ค๋‹ˆ๋ฉฐ ์‹ค์ˆ˜๋ฅผ ํ‘œํ˜„
๋ถ€๋™์†Œ์ˆ˜์ ์„ ํ‘œํ˜„ํ•˜๋Š” ๋‹ค์–‘ํ•œ ์ฒด๊ณ„๊ฐ€ ์žˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๋Š” ํ‘œ์ค€์€ IEEE 754 ์ด๋‹ค.

โœ๏ธ ์‹ค์ˆ˜ ์ž๋ฃŒํ˜• float, double์€ ๊ณ ์ •์†Œ์ˆ˜์ ์— ๋น„ํ•ด์„œ ๋” ํฐ ๋ฒ”์œ„์˜ ์‹ค์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
โ†’ int์™€ float๋Š” 4byte๋กœ ํฌ๊ธฐ๊ฐ€ ๋™์ผํ•˜์ง€๋งŒ float์˜ ํ‘œํ˜„๋ฒ”์œ„๊ฐ€ ํ›จ์”ฌ ํฌ๋‹ค.

์ปดํ“จํ„ฐ๋Š” ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์†Œ์ˆ˜๋ฅผ 2์ง„๋ฒ•์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ๋ถ€๋™์†Œ์ˆ˜์  ํ‘œํ˜„ ๋ฐฉ์‹์œผ๋กœ 0.2๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ 0.001100110011... ์™€ ๊ฐ™์ด 0011์ด ๋ฌดํ•œ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ์ˆ˜๊ฐ€ ๋œ๋‹ค. ์ด๋•Œ ์ปดํ“จํ„ฐ๋Š” 0.2์™€ ๊ฐ™์ด ๋ฌดํ•œ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ์ˆ˜๋Š” ์ •ํ™•ํ•œ ๊ฐ’์œผ๋กœ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ๊ทผ์‚ฌ์น˜๋กœ ์ €์žฅํ•˜๋Š”๋ฐ ์ €์žฅ๋œ ๊ทผ์‚ฌ์น˜๋กœ ์—ฐ์‚ฐ์„ ํ•˜๋Š” ๊ฒฝ์šฐ 0.2๊ฐ€ ์•„๋‹Œ 0.2์— ๊ทผ์ ‘ํ•œ ์ˆ˜๋กœ ์—ฐ์‚ฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์œผ๋ฏ€๋กœ +,- ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

public class FloatDoubleTest {
    public static void main(String[] args) {
        // floatํ˜•
        float num1 = 0.3f;
        float num2 = 0.2f;
        System.out.println(num1 - num2); // 0.1
        System.out.println(2.0f - 1.1);  // 0.9

        // doubleํ˜•
        double num3 = 2.0;
        double num4 = 1.1;
        System.out.println(0.3 - 0.2); 	 // 0.1
        System.out.println(num3 - num4); // 0.9
    }
}

โ–ถ๏ธŽ ์‹คํ–‰๊ฒฐ๊ณผ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

BigDecimal

๋ถˆ๋ณ€์˜ ์ž„์˜์˜ ์ •๋ฐ€๋„ ๋ถ€ํ˜ธ๊ฐ€ ์žˆ๋Š” ์†Œ์ˆ˜.
์ž„์˜์˜ ์ •๋ฐ€๋„ ์ •์ˆ˜ ๋น„์Šค์ผ€์ผ ๊ฐ’๊ณผ 32๋น„ํŠธ ์ •์ˆ˜ ์Šค์ผ€์ผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
โ†’ ๊ทผ์‚ฌ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์œ ํšจ์ˆซ์ž์™€ ์†Œ์ˆ˜์  ์ˆซ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

โ–ถ๏ธŽ ์ˆ˜์ • ์ฝ”๋“œ

public BigDecimal getTotalPrice() {
        return cartItems.entrySet().stream()
                .map(i -> BigDecimal.valueOf(i.getKey().getPrice() * i.getValue()))
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }

๋ฐฐ์šด ์ 

์†Œ์ˆ˜์  ๋‹จ์œ„์˜ ์ˆซ์ž ์—ฐ์‚ฐ์œผ๋กœ ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ˆซ์ž์— ๋ฏผ๊ฐํ•œ ๊ธˆ์œต ๊ฑฐ๋ž˜ ํ”„๋กœ๊ทธ๋žจ ๋“ฑ์„ ๊ฐœ๋ฐœํ•  ๋•Œ float, double์˜ ์‚ฌ์šฉ์€ ์œ„ํ—˜ํ•˜๋‹ค. ์†Œ์ˆ˜์  ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ BigDecimal์„ ์‚ฌ์šฉํ•˜์ž.

profile
์•ˆ๋…•ํ•˜์„ธ์š” :)

0๊ฐœ์˜ ๋Œ“๊ธ€