Как вы можете заставить bc следовать шкале? - PullRequest
2 голосов
/ 22 марта 2019

Я хочу рассчитать процент от нескольких чисел до 2 десятичных знаков. Поскольку мой общий счет довольно высок, деление 100 на это дает действительно небольшое число (0,000 ..), поэтому для этого шага у меня есть большой масштаб 10. Второй шаг, где я умножаю полученное число, чтобы вычислить процент, использует масштаб как 2, но он игнорируется, поскольку bc использует первую шкалу из 10. Вот код, который у меня есть:

mul=$(bc <<< "scale=10; (100/$t)")

while read -r num var
do
perc=$(bc <<< "scale=2; ($num*$mul)")
printf "$var\t$num\t$perc\n" >> ofile
done < counts

Как я могу заставить второй расчет следовать шкале и печатать до 2 десятичных знаков?

Ответы [ 3 ]

1 голос
/ 22 марта 2019

scale (общее количество десятичных цифр после десятичной точки), используемое с bc , работает по-разному в зависимости от используемой арифметической операции.

выражение *выражение

Результатом должно быть произведение двух выражений.Если a и b являются масштабами двух выражений, то масштаб результата должен быть:

min (a + b, max (scale, a, b))

выражение / выражение

Результатом должно быть отношение двух выражений.Масштаб результата должен быть равен значению масштаба.

В этом причина различий между вашим делением и умножением в вашем коде.

1 голос
/ 22 марта 2019

Вы можете решить эту проблему с помощью следующего «kludge»:

a=3.2222222222
b=24.30123
foo=$(bc <<< "x = $a * $b; scale=2; (x * 100) / 100;")
echo $foo

Этот код распечатает следующий вывод:

78.30

Идея в том, что результат вычисления (x * 100) / 100 будет таким же, как и $a * $b (78.303963332793306 ), но масштаб, который будет применен к нему на этот раз, будет равен 2, что, по сути, будет усекать все, что у вас есть, после двух десятичных знаков, делая его 78,30.

По поводу того, что происходит со шкалой числа, полученного в результате умножения двух других чисел, см. Ответ Дж. Ф. Фергюсона.

Код, на самом деле, можно сделать еще короче:

foo=$(bc <<< "scale=2; ($a * $b) / 1")

Это потому, что новое число, которое вы получите, это gong для наследования глобальной шкалы 2, которую вы специально установили.

1 голос
/ 22 марта 2019

Форматирование чисел с помощью printf:

printf '%s\t%s\t%.2f\n' "$var" "$num" "$perc" >> ofile
...