item 60 incheol - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

float์™€ double ํƒ€์ž…์€ ๊ณผํ•™๊ณผ ๊ณตํ•™ ๊ณ„์‚ฐ์šฉ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค. ์ด์ง„ ๋ถ€๋™์†Œ์ˆ˜์  ์—ฐ์‚ฐ์— ์“ฐ์ด๋ฉฐ, ๋„“์€ ๋ฒ”์œ„์˜ ์ˆ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์ •๋ฐ€ํ•œ '๊ทผ์‚ฌ์น˜'๋กœ ๊ณ„์‚ฐํ•˜๋„๋ก ์„ธ์‹ฌํ•˜๊ฒŒ ์„ค๊ณ„๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ float๊ณผ double ํƒ€์ž…์€ ํŠนํžˆ ๊ธˆ์œต ๊ด€๋ จ ๊ณ„์‚ฐ๊ณผ๋Š” ๋งž์ง€ ์•Š๋Š”๋‹ค.

๋‚จ์€ ๋ˆ์„ ๊ณ„์‚ฐํ•ด๋ณด์ž

// Q1. 1.03๋‹ฌ๋Ÿฌ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ์ค‘ 42์„ผํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์–ผ๋งˆ๊ฐ€ ๋‚จ์•˜์„๊นŒ?
System.out.println(1.03 - 0.42);
// result : 0.6.10000000000000001

// Q2. 1๋‹ฌ๋Ÿฌ๋กœ 10์„ผํŠธ์งœ๋ฆฌ ์‚ฌํƒ• 9๊ฐœ๋ฅผ ์‚ด ๊ฒฝ์šฐ์— ์–ผ๋งˆ๊ฐ€ ๋‚จ์•˜์„๊นŒ?
System.out.println(1.00 - 9 * 0.10);
// result : 0.0999999999999998

๊ธˆ์œต ๊ณ„์‚ฐ์—๋Š” BigDecimal, int ํ˜น์€ long์„ ์‚ฌ์šฉํ•˜๋ผ

๋‹ค์Œ์€ BigDecimal์„ ์‚ฌ์šฉํ•œ ๊ณ„์‚ฐ๋ฒ•์ด๋‹ค.

public static void main(String[] args) {
    final BigDecimal TEN_CENTS = new BigDecimal(".10");
    int itemsBought = 0;
    BigDecimal funds = new BigDecimal("1.00");

    for (BigDecimal price = TEN_CENTS; funds.compareTo(price) >= 0; price = price.add(TEN_CENTS)) {
        funds = funds.subtract(price);
        itemsBought++;
    }
    System.out.println(itemsBought + "๊ฐœ ๊ตฌ์ž…");
    System.out.println("์ž”๋ˆ(๋‹ฌ๋Ÿฌ): " + funds);
}

์ด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ์‚ฌํƒ• 4๊ฐœ๋ฅผ ๊ตฌ์ž…ํ•œ ํ›„ ์ž”๋ˆ์€ 0๋‹ฌ๋Ÿฌ๊ฐ€ ๋‚จ๋Š”๋‹ค.

BigDecimal์—๋„ ๋‹จ์ ์€ ์žˆ๋‹ค.

  • ๊ธฐ๋ณธ ํƒ€์ž…๋ณด๋‹ค ์“ฐ๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋ถˆํŽธํ•˜๋‹ค.
  • ํ›จ์”ฌ ๋Š๋ฆฌ๋‹ค.
  • ๋‹จ๋ฐœ์„ฑ์ด๋ผ๋ฉด ๋Š๋ฆฌ๋‹ค๋Š” ๋ฌธ์ œ๋Š” ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์“ฐ๊ธฐ ๋ถˆํŽธํ•˜๋‹ค๋Š” ์ ์€ ๋ชป๋‚ด ์•„์‰ฌ์šธ ๊ฒƒ์ด๋‹ค.

BigDecimal์˜ ๋Œ€์•ˆ์œผ๋กœ int ํ˜น์€ long ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ผ

int์™€ long์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆœ ์žˆ์ง€๋งŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ํฌ๊ธฐ๊ฐ€ ์ œํ•œ๋˜๊ณ , ์†Œ์ˆ˜์ ์„ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋‹ค์Œ์€ ๋ชจ๋“  ๊ณ„์‚ฐ์„ ๋‹ฌ๋Ÿฌ ๋Œ€์‹  ์„ผํŠธ๋กœ ์ˆ˜ํ–‰ํ•œ ์ฝ”๋“œ์ด๋‹ค.

public static void main(String[] args) {
    int itemsBought = 0;
    int funds = 100;
    for (int price = 10; funds >= price; price += 10) {
        funds -= price;
        itemsBought++;
    }
    System.out.println(itemsBought + "๊ฐœ ๊ตฌ์ž…");
    System.out.println("์ž”๋ˆ(์„ผํŠธ): " + funds);
}

์ •๋ฆฌ

์ •ํ™•ํ•œ ๋‹ต์ด ํ•„์š”ํ•œ ๊ณ„์‚ฐ์—๋Š” float๋‚˜ double์„ ํ”ผํ•˜๋ผ. ์†Œ์ˆ˜์  ์ถ”์ •์€ ์‹œ์Šคํ…œ์— ๋งก๊ธฐ๊ณ , ์ฝ”๋”ฉ ์‹œ์˜ ๋ถˆํŽธํ•จ์ด๋‚˜ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ฒ ๋‹ค๋ฉด BigDecimal์„ ์‚ฌ์šฉํ•˜๋ผ. BigDecimal์ด ์ œ๊ณตํ•˜๋Š” ์—ฌ๋ž ๊ฐ€์ง€ ๋ฐ˜์˜ฌ๋ฆผ ๋ชจ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ˜์˜ฌ๋ฆผ์„ ์™„๋ฒฝํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฒ•์œผ๋กœ ์ •ํ•ด์ง„ ๋ฐ˜์˜ฌ๋ฆผ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์‹ผ์—์„œ ์•„์ฃผ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์ด๋‹ค. ๋ฐ˜๋ฉด, ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•˜๊ณ  ์†Œ์ˆ˜์ ์„ ์ง์ ‘ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ณ  ์ˆซ์ž๊ฐ€ ๋„ˆ๋ฌด ํฌ์ง€ ์•Š๋‹ค๋ฉด int๋‚˜ long์„ ์‚ฌ์šฉํ•˜๋ผ. ์ˆซ์ž๋ฅผ ์•„๋กญ ์ž๋ฆฌ ์‹ญ์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด int๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์—ด์—ฌ๋ž ์ž๋ฆฌ ์‹ญ์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด long์„ ์‚ฌ์šฉํ•˜๋ผ. ์—ด์—ฌ๋ž ์ž๋ฆฌ๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด BigDeciamal์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.