Bash 루프 인덱스를 부동 소수점으로 변환

Bash 루프 인덱스를 부동 소수점으로 변환

ifor i in {0..10..5}예를 들어 부동 소수점 계산 과 같은 루프에서 인덱싱을 사용해야 합니다 . i를 부동 소수점 숫자로 변환하는 가장 간단한 방법은 무엇입니까?
변화

i=$(bc -l <<< "scale=7;$i")

작동 안함.

답변1

bc부동 소수점을 지원하는 또는 awk또는 쉘을 사용하십시오 (예 ksh93: zsh또는 yash대신) bash.

기원전

$ bc -l << \EOF
heredoc> for (i = 0; i <=  10; i += 2.5) i / 2
heredoc> EOF
0
1.25000000000000000000
2.50000000000000000000
3.75000000000000000000
5.00000000000000000000

$ awk 'BEGIN {for (i = 0; i <= 10; i += 2.5) print i / 2}'
0
1.25
2.5
3.75
5

다루기 힘든

$ float i; for ((i = 0; i <= 10; i += 2.5)) print $((i/2))
0.
1.25
2.5
3.75
5.

크쉬 93

$ for ((i = 0; i <= 10; i += 2.5)); do print "$((i/2))"; done
0
1.25
2
3.75
5

(소수 구분 기호는 로케일( .또는 ,)에 따라 다릅니다.

야쉬

i=0; while [ "$((i <= 10))" -ne 0 ]; do
  echo "$((i / 2))"
  i=$((i + 2.5))
done

(내부적으로는 $((...))소수 구분 기호로 사용되지만 I/O에서는 .로케일의 1( .또는)이 사용됩니다.),


편집하다

이제 일부 정수를 반복하고 해당 정수가 소수점으로 표현되는 경우 다음을 추가하면 됩니다 .0.

 for i in {0..10..5}.0

또는 위 해결 방법의 경우 / printf "%.7f\n"대신 print/ 를 사용하여 echo소수 구분 기호 뒤의 7자리를 출력합니다.

답변2

중요한 비율을 얻으려면 해당 값을 bc의 일부 값(1이라도)으로 나누어야 합니다.

$ i=5; bc -l <<< "scale=7;$i/1"
5.0000000

$  i=5; bc -l <<< "scale=7;$i/2"
2.5000000

편집하다:

특별한 경우 0(기본적으로 추가되지 않음 .0000000)의 경우 다음을 추가할 수 있습니다.

$ [ "$i" -eq 0 ] && i="0.0000000"

하지만경계하다이는 값을 부동 소수점으로 만드는 것이 아니라 부동 소수점과 유사한 문자열로 만듭니다.

또는 printf원하는 표현을 얻을 수 있습니다.

$ i=3.75
$ i=$( printf "%.7f\n" "$i" )
$ echo "$i"
3.7500000

bash printf는 기본 소수 구분 기호를 존중합니다. 쉼표인 경우에는 i=3,75쉼표를 넣어도 같은 결과가 나옵니다.


실제로 부동 소수점 숫자를 사용하려면 다른 언어나 일부 셸로 변경해야 합니다.

소수점을 표시하려면 점을 사용하세요.

$ awk 'BEGIN { i=5; print( i / 2 ); i=7; print( i / 3 ) }'
2.5
2.33333

로캘 설정을 존중합니다.

$ float i; i=7; print $((i/2)); print $((i/3)); print $((3,7/2))
3,5
2,33333333333333333
1,85

.zsh는 쉼표를 사용하는 로케일에서도 점을 사용합니다 ,.

$ float i; i=7; print $((i/2)); print $((i/3))         ### or typeset -f i
3.5
2.3333333333333335

$ echo $(( 7/3 )); echo $(( 7.0/3 ))
2
2,33333333333333

$ i=7; echo $(( i/3 )); i=7,0; echo $(( i/3 ))
2
2,33333333333333

부동 소수점 숫자는 로컬 소수 구분 기호를 사용하여 할당되어야 합니다.
단, $(( ))포인트는 내부적으로 사용해야 합니다.

관련 정보