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

μ‹€μˆ˜μ˜ ν‘œν˜„ 방식

μ»΄ν“¨ν„°μ—μ„œ μ‹€μˆ˜λ₯Ό ν‘œν˜„ν•˜λŠ” 방법은 μ •μˆ˜μ— λΉ„ν•΄ 훨씬 λ³΅μž‘ν•˜λ‹€.

μ™œλƒν•˜λ©΄, μ»΄ν“¨ν„°μ—μ„œλŠ” μ‹€μˆ˜λ₯Ό μ •μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 2μ§„μˆ˜λ‘œλ§Œ ν‘œν˜„ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έ.

μ•„λž˜μ˜ 2가지 μ‹€μˆ˜ ν‘œν˜„ 방식이 μžˆλ‹€.

  1. κ³ μ • μ†Œμˆ˜μ (fixed point) 방식

  2. 뢀동 μ†Œμˆ˜μ (floating point) 방식

κ³ μ • μ†Œμˆ˜μ  방식에 λΉ„ν•΄ 뢀동 μ†Œμˆ˜μ  방식은 ν‘œν˜„ν•  수 μžˆλŠ” λ²”μœ„κ°€ 훨씬 크닀.

λŒ€λΆ€λΆ„μ˜ μ‹œμŠ€ν…œμ—μ„œ 뢀동 μ†Œμˆ˜μ  방식을 μ‚¬μš©μ€‘μ΄λ‹€.

그리고 ν˜„μž¬ μ‚¬μš©λ˜κ³  μžˆλŠ” 뢀동 μ†Œμˆ˜μ  방식은 λŒ€λΆ€λΆ„ IEEE 754 ν‘œμ€€μ„ λ”°λ₯΄κ³  μžˆλ‹€.

float와 double λ³€μˆ˜λ„ 이 뢀동 μ†Œμˆ˜μ  방식을 μ‚¬μš©μ€‘μ΄λ‹€.

뢀동 μ†Œμˆ˜μ  λ°©μ‹μ˜ 단점

λΆ€μ •ν™•ν•˜λ‹€

IEEE 754의 값을 κ³„μ‚°ν•˜λŠ” κ³ μœ ν•œ μˆ˜μ‹(Β±(1.κ°€μˆ˜λΆ€)Γ—2^μ§€μˆ˜λΆ€-127)λ•Œλ¬Έμ—

float(32 bit)λŠ” μ†Œμˆ˜ 9번째 자리, double(64 bit)λŠ” μ†Œμˆ˜ 15번째 μžλ¦¬κΉŒμ§€λ§Œ

μ •ν™•νžˆ ν‘œν˜„ν•  수 있고 κ·Έ μ΄ν›„λŠ” λΆ€μ •ν™•ν•˜λ‹€.

System.out.println(1.03 - 0.42);
//0.6100000000000001

System.out.println((1.00 - 9 * 0.10));
//0.09999999999999998

λŒ€μ•ˆ : 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);
}

참고둜 BigDecimal은 λ‚΄λΆ€μ μœΌλ‘œ char 배열을 μ‚¬μš©ν•˜μ—¬ 값을 μ²˜λ¦¬ν•œλ‹€

public BigDecimal(char[] in, int offset, int len, MathContext mc)
  • int
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);
}

BigDecimal은 μ‚¬μš©ν•˜κΈ° λΆˆνŽΈν•˜κ³  λŠλ¦¬λ‹€λŠ” 단점이 μžˆλ‹€.

그리고 int와 long은 κ°’μ˜ 크기가 μ œν•œλ˜κ³  μ†Œμˆ˜μ μ„ 직접 관리해야 ν•œλ‹€λŠ” 단점이 μžˆλ‹€.

상황에 μ•Œλ§žμ€ νƒ€μž…μ„ 잘 κ³¨λΌμ„œ μ“°λ©΄ λ˜κ² λ‹€!