item 60 JungHyunLyoo - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
μ€μμ νν λ°©μ
μ»΄ν¨ν°μμ μ€μλ₯Ό νννλ λ°©λ²μ μ μμ λΉν΄ ν¨μ¬ 볡μ‘νλ€.
μλνλ©΄, μ»΄ν¨ν°μμλ μ€μλ₯Ό μ μμ λ§μ°¬κ°μ§λ‘ 2μ§μλ‘λ§ ννν΄μΌ νκΈ° λλ¬Έ.
μλμ 2κ°μ§ μ€μ νν λ°©μμ΄ μλ€.
-
κ³ μ μμμ (fixed point) λ°©μ
-
λΆλ μμμ (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μ κ°μ ν¬κΈ°κ° μ νλκ³ μμμ μ μ§μ κ΄λ¦¬ν΄μΌ νλ€λ λ¨μ μ΄ μλ€.
μν©μ μλ§μ νμ μ μ 골λΌμ μ°λ©΄ λκ² λ€!