Почему делает подразделение в арифметике удара, вычисляют большинство процентов как 0?

Попытка удара arithemetic для сценария, но $e не обновляет до конца. Вывод выступает за себя.

max=5
for e in $(seq 1 1 $max); do 
    percent=$(( $e/$max*100 ))
    echo "echo $e / $max : = $percent"
done

Tl; DR: Дисплей 1.. 5 как процент.

Вывод:

echo 1 / 5 : = 0
echo 2 / 5 : = 0
echo 3 / 5 : = 0
echo 4 / 5 : = 0
echo 5 / 5 : = 100

Почему это?

15
задан 9 September 2019 в 12:00

4 ответа

bash не может обработать арифметику нецелого числа. Это даст Вам корректный результат, пока все выражения являются целыми числами. Таким образом, необходимо постараться не получать значение нецелого числа где-нибудь в вычислении.

В Вашем случае, когда Вы оцениваете 1 / 5, 2 / 5 и т.д., это создает целочисленную нулевую стоимость в передачах удара к некоторым значениям нецелого числа, и результаты выходят, чтобы быть нулем соответственно. Приоритет из разделения и умножения является тем же, и те же операторы прецедента всегда выполняются слева направо, как они размещаются в выражение.

Одна работа вокруг должна будет сделать умножение сначала и затем разделение, таким образом, удар никогда не должен обрабатывать значение нецелого числа. Исправленное выражение будет,

$ max=5; for e in $(seq 1 1 $max); do percent=$(( $e*100/$max )); echo "echo $e / $max : = $percent"; done
echo 1 / 5 : = 20
echo 2 / 5 : = 40
echo 3 / 5 : = 60
echo 4 / 5 : = 80
echo 5 / 5 : = 100
24
ответ дан 23 November 2019 в 02:38

Bash не делает очень хорошо в этом виде арифметики... Вот Ваша проблема:

$ echo $((1/5))
0
$ echo $((2/5))
0
$ echo $((4/5))
0
$ echo $((4/5))
0

, Если необходимо обработать значения нецелого числа, можно использовать bc

$ max=5; for e in $(seq 1 1 "$max"); do percent=$(bc <<< "scale=1 ; $e/$max*100") ; echo "echo $e / $max : = ${percent%.*}"; done
echo 1 / 5 : = 20
echo 2 / 5 : = 40
echo 3 / 5 : = 60
echo 4 / 5 : = 80
echo 5 / 5 : = 100

(благодаря @Arronical для указания, как отформатировать вывод как целые числа)

16
ответ дан 23 November 2019 в 02:38

В отличие от удара, awk предлагает полную арифметику с плавающей точкой. Например:

$ awk -v max=5 'BEGIN{for (e=1;e<=max;e++) print "echo " e " / " max " : = " 100*e/max}' 
echo 1 / 5 : = 20
echo 2 / 5 : = 40
echo 3 / 5 : = 60
echo 4 / 5 : = 80
echo 5 / 5 : = 100
11
ответ дан 23 November 2019 в 02:38

Попробуйте

percent=$(( $e*100/$max ))

:)

ОЦЕНКА АРИФМЕТИКИ раздела See:

man bash

Это только поддерживает целое число.

5
ответ дан 23 November 2019 в 02:38

Другие вопросы по тегам:

Похожие вопросы: