Сценарий Bash: укажите до н.э выходной числовой формат

Поздравления!

Я использую для создания некоторых вычислений в моем сценарии. Например:

bc
scale=6
1/2
.500000

Для дальнейшего использования в моем сценарии мне нужно "0.500000" insted ".500000".

Вы могли помочь мне по возможности настроить до н.э выходной числовой формат для своего случая?

10
задан Andrey Kazak 3 June 2010 в 11:20
поделиться

4 ответа

Я считаю, что это модифицированная версия функции:

float_scale=6

function float_eval()
{
    local stat=0
    local result=0.0
    if [[ $# -gt 0 ]]; then
        result=$(echo "scale=$float_scale; $*" | bc -q | awk '{printf "%f\n", $0}' 2>/dev/null)
        stat=$?
        if [[ $stat -eq 0  &&  -z "$result" ]]; then stat=1; fi
    fi
    echo $result
    return $stat
}
2
ответ дан 3 December 2019 в 14:43
поделиться

Можете ли вы объяснить использование bc в более понятном контексте? Для чего вы используете результаты bc?

Учитывая следующее в файле под названием some_math.bc

scale=6
output=1/2
print output

в командной строке я могу сделать следующее, чтобы добавить ноль:

$ bc -q some_math.bc | awk '{printf "%08f\n", $0}'
0.500000

Если бы мне нужно было, чтобы в выходной строке был ноль только для форматирования, я бы использовал awk.

1
ответ дан 3 December 2019 в 14:43
поделиться

Быстро и грязно, поскольку scale применяется только к десятичным цифрам, а bc, похоже, не имеет sprintf-подобной функции:

$ bc
scale = 6
result = 1 / 2
if (0 <= result && result < 1) {
    print "0"
}
print result;
4
ответ дан 3 December 2019 в 14:43
поделиться

Просто выполняйте все свои вычисления и выводите их в awk:

float_scale=6
result=$(awk -v scale=$floatscale 'BEGIN { printf "%.*f\n", scale, 1/2 }')

В качестве альтернативы , если вы предпочитаете использовать bc и не использовать AWK отдельно или с 'bc', printf Bash поддерживает числа с плавающей запятой, хотя остальная часть Bash этого не делает.

result=$(echo "scale=$float_scale; $*" | bc -q 2>/dev/null)
result=$(printf '%*.*f' 0 "$float_scale" "$result")

Вторая строка выше могла бы быть такой:

printf -v $result '%*.*f' 0 "$float_scale" "$result"

Что работает как sprintf , но не создает подоболочку.

4
ответ дан 3 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

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