printf
내 시스템에서 두 가지 다른 구현을 테스트 printf (GNU coreutils) 8.26
하고 zsh 5.3.1
있습니다. 및와 번들로 제공되는 버전 . 반 숫자가 반올림되는 방법, 즉 1.5, 2.5, 3.5,… 9.5를 테스트하고 있습니다.
$ for i in {1..9}; do /usr/bin/printf '%.0f\n' "${i}.5"; done
2
2
4
4
6
6
8
8
10
$ for i in {1..9}; do printf '%.0f\n' "${i}.5"; done
2
2
4
4
6
6
8
8
10
여기서 모두 반으로 짝수로 반올림 합니다. 그러나 첫 번째 소수점으로 반올림을 테스트하면 상황이 혼란스러워집니다. 즉, 1.15, 1.25, 1.35,… 1.95 테스트 중입니다.
$ for i in {1..9}; do /usr/bin/printf '%.1f\n' "1.${i}5"; done
1.1
1.2
1.4
1.5
1.5
1.6
1.8
1.9
2.0
$ for i in {1..9}; do printf '%.1f\n' "1.${i}5"; done
1.1
1.2
1.4
1.4
1.6
1.6
1.8
1.9
1.9
두 구현 모두 다르게 수행하며 명확한 패턴을 볼 수 없습니다. 이 두 printf
반올림 은 어떻게 소수점 첫째 자리까지 반 올립니까?
답변
GNU printf 는long double
zsh 는 regular double
s를 사용 하지만 사용합니다 . 반올림 동작은 1.45를 2의 거듭 제곱으로 표현할 수 없기 때문에 IEEE 754 부동 소수점 표현이 작동 하는 방식이며 가장 가까운 근사는 정밀도에 따라 달라집니다. 약간 더 많거나 (80 비트가 있음) (64 비트가 있음) 보듯이 반올림 또는 내림합니다.
예를 들어 정확한 인간 수준 표현과 반올림에 관심이 있다면 부동 소수점을 사용하지 마십시오.