λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Language/Java

[Java]μžλ°” μ‹€μˆ˜ νƒ€μž…

by YJ Dev 2024. 4. 21.
728x90
λ°˜μ‘ν˜•
SMALL

μžλ°”μ—μ„œλŠ” μ •μˆ˜μ™€ ν•¨κ»˜ μ‹€μˆ˜ νƒ€μž…λ„ 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. μ •μˆ˜ νƒ€μž…κ³Ό 달리 μ‹€μˆ˜ νƒ€μž…μ€ μ†Œμˆ˜μ  μ΄ν•˜μ˜ 값을 μ €μž₯ν•  수 μžˆμ–΄μ„œ κ³„μ‚°μ˜ 정확도와 유효 자릿수λ₯Ό μ‘°μ ˆν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μžλ°” μ‹€μˆ˜νƒ€μž…



1. μ‹€μˆ˜ νƒ€μž…μ˜ μ’…λ₯˜πŸ 


μžλ°”μ—μ„œλŠ” 주둜 floatκ³Ό double 두 가지 μ‹€μˆ˜ νƒ€μž…μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. float은 32λΉ„νŠΈλ‘œ ν‘œν˜„λ˜λ©°, double은 64λΉ„νŠΈλ‘œ ν‘œν˜„λ©λ‹ˆλ‹€. double은 보닀 큰 λ²”μœ„μ˜ 값을 μ €μž₯ν•  수 있으며, 일반적으둜 더 높은 정밀도λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

  • float :4byte μ‹€μˆ˜(6 ~ 9자리)
  • double/b>:8byte μ‹€μˆ˜(κΈ°λ³Έκ°’)(15 ~ 18자리)

μžλ°” μ‹€μˆ˜νƒ€μž…

floatκ³Ό double νƒ€μž…μ€ κ°€μˆ˜μ™€ μ§€μˆ˜λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ 전체 λΉ„νŠΈλ₯Ό λ‹€μŒκ³Ό 같이 λ‚˜λˆ„μ–΄ μ‚¬μš©ν•©λ‹ˆλ‹€.

  • μ΅œμƒμœ„ 1λΉ„νŠΈλŠ” λΆ€ν˜Έλ₯Ό κ²°μ •μ§“λŠ” λΆ€ν˜Έ λΉ„νŠΈμž…λ‹ˆλ‹€. 0은 μ–‘μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄κ³ , 1은 음수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • float νƒ€μž…μ€ 32λΉ„νŠΈλ‘œ ν‘œν˜„λ˜λ©°, 이 쀑 1λΉ„νŠΈλŠ” λΆ€ν˜Έλ₯Ό λ‚˜νƒ€λ‚΄κ³  λ‚˜λ¨Έμ§€ λΉ„νŠΈλŠ” κ°€μˆ˜μ™€ μ§€μˆ˜λ₯Ό ν‘œν˜„ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • double νƒ€μž…μ€ 64λΉ„νŠΈλ‘œ ν‘œν˜„λ˜λ©°, 이 쀑 1λΉ„νŠΈλŠ” λΆ€ν˜Έλ₯Ό λ‚˜νƒ€λ‚΄κ³  λ‚˜λ¨Έμ§€ λΉ„νŠΈλŠ” κ°€μˆ˜μ™€ μ§€μˆ˜λ₯Ό ν‘œν˜„ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. double νƒ€μž…μ€ float νƒ€μž…λ³΄λ‹€ 더 λ§Žμ€ λΉ„νŠΈλ₯Ό κ°€μ§€λ―€λ‘œ 더 크고 μ •λ°€ν•œ μ‹€μˆ˜λ₯Ό μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

일반적으둜, μ»΄νŒŒμΌλŸ¬λŠ” μ‹€μˆ˜ λ¦¬ν„°λŸ΄μ„ 기본적으둜 double νƒ€μž…μœΌλ‘œ ν•΄μ„ν•©λ‹ˆλ‹€. λ”°λΌμ„œ λ§Œμ•½ float νƒ€μž… λ³€μˆ˜μ— λŒ€μž…ν•˜λ €λ©΄ λ¦¬ν„°λŸ΄ 뒀에 μ†Œλ¬Έμž fλ‚˜ λŒ€λ¬Έμž Fλ₯Ό λΆ™μ—¬μ•Ό ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ μ»΄νŒŒμΌλŸ¬κ°€ ν•΄λ‹Ή 값을 float νƒ€μž…μœΌλ‘œ μΈμ‹ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

// float λ³€μˆ˜ μ„ μ–Έ 및 μ΄ˆκΈ°ν™”
float weight = 65.5f;

// double λ³€μˆ˜ μ„ μ–Έ 및 μ΄ˆκΈ°ν™”
double height = 175.3;

2.정밀도와 κ·Όμ‚¬μΉ˜ πŸ¦€

μ‹€μˆ˜λŠ” μ»΄ν“¨ν„°μ—μ„œ μ €μž₯λ˜λŠ” λ²”μœ„λ³΄λ‹€ λ¬΄ν•œλŒ€μ— κ°€κΉŒμš°λ―€λ‘œ, λͺ¨λ“  κ°€λŠ₯ν•œ 값을 μ •ν™•ν•˜κ²Œ ν‘œν˜„ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. 이둜 인해 근삿값이 μ‚¬μš©λ˜λ©°, μ‹€μˆ˜μ˜ μ†Œμˆ˜μ  μ΄ν•˜ 유효 λ²”μœ„κΉŒμ§€λ§Œ μ €μž₯λ©λ‹ˆλ‹€. λ”°λΌμ„œ, μ‹€μˆ˜ μ—°μ‚° κ³Όμ •μ—μ„œλŠ” μ •λ°€λ„μ˜ ν•œκ³„μ™€ κ·Όμ‚¬μΉ˜μ— λ”°λ₯Έ μ˜€μ°¨κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ •λ°€λ„λŠ” 특히 μ‹€μˆ˜μ˜ 유효 자릿수λ₯Ό μ˜λ―Έν•˜λ©°, μ΄λŠ” 컴퓨터가 νŠΉμ • κ°’κ³Ό κ·Έ μ£Όλ³€ 값듀을 ν‘œν˜„ν•  수 μžˆλŠ” 정도λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, double νƒ€μž…μ€ μ•½ 1518자리의 유효 자릿수λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 컴퓨터가 μ‹€μ œ κ°’κ³Ό κ·Έ μ£Όλ³€ 값듀을 μ•½ 1518μžλ¦¬κΉŒμ§€ μ •ν™•ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, μ‹€μˆ˜ μ—°μ‚°μ—μ„œλŠ” μ—°μ‚° κ³Όμ •μ—μ„œ 반올림 μ˜€μ°¨μ™€ λΆ€λ™μ†Œμˆ˜μ  ν‘œν˜„ λ°©μ‹μœΌλ‘œ μΈν•œ μ˜€μ°¨κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 컴퓨터가 μ΄μ§„μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹€μˆ˜λ₯Ό ν‘œν˜„ν•˜κΈ° λ•Œλ¬Έμ— λ°œμƒν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€. λ”°λΌμ„œ, 반볡적인 μ‹€μˆ˜ μ—°μ‚° 처리λ₯Ό ν•  λ•ŒλŠ” μ΄λŸ¬ν•œ μ˜€μ°¨κ°€ λˆ„μ λ  수 있으며, μ •ν™•ν•œ κ²°κ³Όλ₯Ό κΈ°λŒ€ν•˜κΈ° μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

κ²°κ΅­, μ»΄ν“¨ν„°μ—μ„œμ˜ μ‹€μˆ˜ 연산은 항상 κ·Όμ‚¬μΉ˜λ₯Ό λ‹€λ£¨λŠ” κ²ƒμœΌλ‘œ 이해해야 ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이해λ₯Ό λ°”νƒ•μœΌλ‘œ μ‹€μˆ˜λ₯Ό λ‹€λ£° λ•ŒλŠ” 였차λ₯Ό μ΅œμ†Œν™”ν•˜κ³ , 문제의 λ³Έμ§ˆμ— μ§‘μ€‘ν•˜μ—¬ μ•ˆμ •μ μ΄κ³  μ •ν™•ν•œ κ²°κ³Όλ₯Ό 얻을 수 μžˆλ„λ‘ λ…Έλ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.

// 정밀도 예제
double result = 0.1 + 0.2;
System.out.println(result); // κ²°κ³Ό: 0.30000000000000004
public class Main {
    public static void main(String[] args) {
        // μ‹€μˆ˜ μžλ£Œν˜•μ˜ 정밀도에 λŒ€ν•œ 이해 예제
        double result;

        // μ •μˆ˜ λ‚˜λˆ„κΈ° μ •μˆ˜μ˜ κ²°κ³ΌλŠ” μ •μˆ˜μ΄λ―€λ‘œ 5/4λŠ” 1이 됨
        result = 5 / 4;
        System.out.println("5 / 4 = " + result); // 좜λ ₯ κ²°κ³Ό: 1.0

        // μ‹€μˆ˜λ‘œ κ³„μ‚°ν•˜λ €λ©΄ 적어도 ν•˜λ‚˜μ˜ ν”Όμ—°μ‚°μžκ°€ μ‹€μˆ˜ν˜•μ΄μ–΄μ•Ό 함
        result = (double) 5 / 4;
        System.out.println("(double) 5 / 4 = " + result); // 좜λ ₯ κ²°κ³Ό: 1.25

        // μ‹€μˆ˜ν˜•μœΌλ‘œ λ³€ν™˜ν•œ ν›„ μ •μˆ˜κ°’μ„ λ”ν•˜λ©΄ μ‹€μˆ˜ 뢀뢄은 버렀짐
        result = (int) 5.5 + (int) 1.5;
        System.out.println("(int) 5.5 + (int) 1.5 = " + result); // 좜λ ₯ κ²°κ³Ό: 6.0

        // μ‹€μˆ˜ μžλ£Œν˜•μ˜ 정밀도 확인
        float b3 = 0.123456789123456789F;
        double b4 = 0.123456789123456789;
        System.out.println("float: " + b3); // 좜λ ₯ κ²°κ³Ό: 0.12345679
        System.out.println("double: " + b4); // 좜λ ₯ κ²°κ³Ό: 0.12345678912345678
    }
}

3. ν•΅μ‹¬λ‚΄μš©πŸ‘€

μžλ°” μ‹€μˆ˜νƒ€μž…

728x90
λ°˜μ‘ν˜•