Java programming

[Java programming] - integer division in floating-point context

ν”„λ‘œκ·Έλž˜λ¨Έ μ˜€μ›” 2023. 11. 6.

μ½”λ”© ν…ŒμŠ€νŠΈ 문제λ₯Ό ν’€λ‹€κ°€ 둜직이 ν‹€λ¦°κ²Œ μ—†λŠ”λ° μ „λΆ€ 0 값이 λ‚˜μ™€μ„œ λ‹Ήν™©ν–ˆλ‹€κ°€ μ•„μ£Ό 바보같은 μ‹€μˆ˜λ₯Ό ν–ˆκΈ°μ— κΈ€λ‘œμ„œ 남기렀고 ν•œλ‹€.
λͺ¨λ‘ λ‹€ μ•„λŠ” κ°œλ…μΌν…Œμ§€λ§Œ, μˆ˜ν•™κ³΅μ‹ 풀듯이 μ“°λ‹ˆ μžλ£Œν˜•μ„ μƒκ°ν•˜μ§€ μ•Šκ³ , ν’€κ²Œ λ˜μ—ˆλ‹€κ°€ λ‚˜μ˜€λŠ” 였λ₯˜μ΄λ‹€.

 

λ¬Έμ œκ°€ μΌμ–΄λ‚œ 곳은 λ°”λ‘œ ν• μΈμœ¨μ„ κ΅¬ν•˜λŠ” λΆ€λΆ„μ—μ„œ 일어났닀. κ΄€λ ¨ μ½”λ”©ν…ŒμŠ€νŠΈ λ¬Έμ œλ‘œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

https://school.programmers.co.kr/learn/courses/30/lessons/150368

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr

 

ν• μΈμœ¨μ„ μ μš©ν•˜μ—¬ 총값을 κ΅¬ν•˜λŠ”λ°, 총값이 λͺ¨λ‘ 0이 λ‚˜μ˜¨ 것이닀.

ν•œ 30λΆ„ μ§Έ 뭐가 ν‹€λ¦°μ§€ λ””λ²„κΉ…ν•˜λ‹€κ°€ μ‚¬μ†Œν•œ μ‹€μˆ˜λ₯Ό ν•œ 것을 λ°œκ²¬ν–ˆλ‹€.

 

40% DC 된 κ°’  →  원가 * (( 100 - 40) / 100);

원가 * 0.6 을 ν•˜κ³  μ‹Άμ–΄, (( 100 - 40) / 100) 이 κΈ°λŒ€κ°’μ΄ 0.6이 λ‚˜μ˜€κΈΈ λ°”λž¬μ§€λ§Œ, μ• μ΄ˆμ— λͺ«μ„ κ΅¬ν•˜λŠ” / 연산이기 λ•Œλ¬Έμ— λ‚΄κ°€ μ›ν•˜λŠ” 0.6은 μ ˆλŒ€λ‘œ λ‚˜μ˜¬ μˆ˜κ°€ μ—†λ‹€. 심지어 μžλ£Œν˜• λ§ˆμ €λ„ int μ˜€λ‹€.

(μ£Όμž…μ‹ ꡐ윑의 폐해인가...πŸ₯²)

 

그럼 μžλ£Œν˜•λ§Œ float둜 λ°”κΏ”μ£Όλ©΄ 될까?πŸ€” 

float result2 = (100 - 40) / 100;

 

그것 λ˜ν•œ μ•„λ‹ˆλ‹€. μ •λ‹΅μ˜ μžλ£Œν˜•λ§Œ float둜 λ°”κΏ”μ£Όλ©΄ κ²°κ³Όκ°’ 0 을 κ·Έλƒ₯ μ‹€μˆ˜λ‘œ ν˜•λ³€ν™˜ μ‹œμΌœμ€„ 뿐이기 λ•Œλ¬Έμ΄λ‹€.

κ²°κ³Ό 값은 0.0이 λ‚˜μ˜¨λ‹€.

 

μœ„μ™€ 같이 μž‘μ„±ν•œλ‹€λ©΄, integer division in floating-point context λΌλŠ” IDE의 κ²½κ³  문ꡬλ₯Ό 확인할 수 μžˆλ‹€.
이 κ²½κ³ λŠ” "μ‹€μˆ˜ μ—°μ‚° λ¬Έλ§₯μ—μ„œ μ •μˆ˜ λ‚˜λˆ—μ…ˆ"을 μ˜λ―Έν•œλ‹€. 일반적으둜 μˆ˜ν•™μ μΈ κ³„μ‚°μ—μ„œ, κ΄„ν˜Έ μ•ˆμ˜ 연산을 μˆ˜ν–‰ν•˜κ³  λ‚˜μ„œ λ‚˜λˆ—μ…ˆμ„ μˆ˜ν–‰ν•  λ•Œ κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜λŠ” 것은 μ—°μ‚° μˆœμ„œλ₯Ό λͺ…ν™•ν•˜κ²Œ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ 것이닀.

"(100 - 40) / 100"μ΄λΌλŠ” ν‘œν˜„μ—μ„œλŠ” λ¨Όμ € κ΄„ν˜Έ μ•ˆμ˜ 연산인 "100 - 40"이 μˆ˜ν–‰λ˜μ–΄ 60을 μ–»κ³ , κ·Έ κ²°κ³Όλ₯Ό 100으둜 λ‚˜λˆ„κ²Œ λœλ‹€. μ΄λ•Œ, λ‚˜λˆ—μ…ˆ 연산은 일반적으둜 μ‹€μˆ˜ μ—°μ‚°μœΌλ‘œ κ°„μ£Όλ˜μ§€λ§Œ, "integer division in floating-point context"λΌλŠ” ν‘œν˜„μ€ μ‹€μˆ˜ μ—°μ‚° λ¬Έλ§₯μ—μ„œ μ •μˆ˜ λ‚˜λˆ—μ…ˆμ„ μ˜λ―Έν•œλ‹€.

μ‹€μˆ˜ μ—°μ‚° λ¬Έλ§₯μ—μ„œ μ •μˆ˜ λ‚˜λˆ—μ…ˆμ€ μ •μˆ˜λ₯Ό μ •μˆ˜λ‘œ λ‚˜λˆŒ λ•Œ λ‚˜λ¨Έμ§€λ₯Ό λ¬΄μ‹œν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. 예λ₯Ό λ“€μ–΄, 60을 100으둜 λ‚˜λˆŒ λ•Œ 일반적인 λ‚˜λˆ—μ…ˆ κ²°κ³ΌλŠ” 0.6μ΄μ§€λ§Œ, "integer division in floating-point context"μ—μ„œλŠ” 0.6 λŒ€μ‹ μ— μ •μˆ˜ κ²°κ³Ό 0을 λ°˜ν™˜ν•œλ‹€.

결과적으둜 "(100 - 40) / 100"의 값은 0.6이 μ•„λ‹ˆλΌ 0이닀.

float ν•΄λ΄€μž 0.0이 λ‚˜μ˜¨λ‹€.

 

0.6을 μ–»κ³  μ‹ΆμœΌλ©΄ μ—°μ‚° 자체λ₯Ό μ‹€μˆ˜ μ—°μ‚°μœΌλ‘œ ν˜•λ³€ν™˜ μ‹œμΌœμ€˜μ•Όν•œλ‹€.

λ¬Όλ‘  μœ„ λ¬Έμ œμ—μ„  μ‹€μˆ˜ ν˜•λ³€ν™˜ν•΄μ„œ ν’€μ§€ μ•Šκ³ , κ·Έλƒ₯ 100으둜 λ‚˜λˆ λ„ λͺ«μ΄ λ‚˜μ˜€κ²Œλ” 큰 수 μ—°μ‚°ν•˜κ³  100으둜 λ‚˜λˆ„μ—ˆλ‹€. μ΄μœ λŠ” κ°„λ‹¨ν•˜λ‹€. ν˜•λ³€ν™˜μ„ ν•˜λŠ”λ°μ— λ¦¬μ†ŒμŠ€κ°€ 투자되기 λ•Œλ¬Έμ΄λ‹€. ꡳ이 μ•ˆν•˜κ³  ν’€μˆ˜λ„ μžˆλŠ”λ°, λ”λ””κ²Œ μ—°μ‚°ν•  ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

public class Note05 {
    public static void main(String[] args) {
        int result1 = (100 - 40) / 100;
        System.out.println(result1);

        float result2 = (100 - 40) / 100;
        System.out.println(result2);

        float result3 = (float) (100 - 40) / 100;
        System.out.println(result3);
    }
}

λŒ“κΈ€