printf를 소수 첫째 자리로 반올림하는 방법은 무엇입니까?

printf를 소수 첫째 자리로 반올림하는 방법은 무엇입니까?

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

두 구현 모두 다르며 어느 쪽에서도 명확한 패턴을 볼 수 없습니다. 이 두 s는 어떻게 printf소수 첫째 자리로 반올림되나요?

답변1

GNU 인쇄 기능사용long double그리고 zsh일반 doubles를 사용하세요. 반올림 동작은 (예를 들어) 1.45가 2의 거듭제곱의 합으로 표현될 수 없기 때문입니다.IEEE 754 부동 소수점 표현유효하며 가장 가까운 근사치는 정확도에 따라 다릅니다. 약간 더 크거나(80비트) 더 작거나(64비트) 보시다시피 반올림되거나 내림됩니다.

언제나 그렇듯, 정확한 인간 수준 표현과 반올림에 관심이 있다면 부동 소수점을 사용하지 마세요.

관련 정보