Как использовать expr на float? - PullRequest
23 голосов
/ 10 августа 2009

Я знаю, что это действительно глупый вопрос, но я не знаю, как это сделать в bash:

20 / 30 * 100

Это должно быть 66.67, но expr говорит 0, потому что он не поддерживает float. Какая команда в Linux может заменить выражение и выполнить это уравнение?

Ответы [ 5 ]

31 голосов
/ 10 августа 2009

bc сделает это за вас, но порядок важен.

> echo "scale = 2; 20 * 100 / 30" | bc
66.66
> echo "scale = 2; 20 / 30 * 100" | bc
66.00

или, для вашего конкретного случая:

> export ach_gs=2
> export ach_gs_max=3
> x=$(echo "scale = 2; $ach_gs * 100 / $ach_gs_max" | bc)
> echo $x
66.66

Какой бы метод вы ни выбрали, он подходит для включения в функцию, которая сделает вашу жизнь проще:

#!/bin/bash
function pct () {
    echo "scale = $3; $1 * 100 / $2" | bc
}

x=$(pct 2 3 2) ; echo $x # gives 66.66
x=$(pct 1 6 0) ; echo $x # gives 16
14 голосов
/ 12 августа 2009

Я обычно использую Perl:

perl -e 'print 10 / 3'
10 голосов
/ 10 августа 2009

просто сделай это в awk

# awk 'BEGIN{print 20 / 30 * 100}'
66.6667

сохранить в переменную

# result=$(awk 'BEGIN{print 20 / 30 * 100}')
# echo $result
66.6667
5 голосов
/ 10 августа 2009

Как сообщается на справочной странице bash:

Оболочка позволяет вычислять арифметические выражения при определенных обстоятельствах ... Оценка выполняется в целых числах фиксированной ширины без проверки на переполнение, хотя деление на 0 перехватывается и помечается как ошибка.

Вы можете умножить на 100 раньше, чтобы получить лучший частичный результат:

let j=20*100/30
echo $j

66

Или по кратному 10 и представьте десятичное место, к которому оно принадлежит:

let j=20*10000/30
echo $j

66666

4 голосов
/ 14 сентября 2016
> echo "20 / 30 * 100" | bc -l
66.66666666666666666600

Это упрощение ответа по paxdiablo. -L устанавливает масштаб (количество цифр после десятичной дроби) равным 20. Он также загружает математическую библиотеку с функциями триггера и другими вещами.

...