Быстрый пример того, что я хочу, используя bash-скриптинг:
#!/bin/bash
echo "Insert the price you want to calculate:"
read float
echo "This is the price without taxes:"
echo "scale=2; $float/1.18" |bc -l
read -p "Press any key to continue..."
bash scriptname.sh
Предполагая, что цена: 48,86 Ответ будет: 41,406779661 (41,40 на самом деле, потому что я использую scale=2;
)
Мой вопрос: как мне округлить второе десятичное число, чтобы показать ответ таким образом ?: 41.41
bc
не может достичь того, что запрашивается (или, по крайней мере, вопрос, который я задавал, когда нашел этот пост), а именно, как округлить десятичные дроби с помощьюbc
( который вызываетсяbash
).r()
функцией, так что вы можете использоватьbc -le "r($float/1.18, 2)"
.Ответы:
Функция bash round:
Используется в вашем примере кода:
Удачи: о)
источник
-0.5
$2 = 3
мне пришлось использоватьecho $(env printf %.3f $(echo "scale=3;((1000*$1)+0.5)/1000" | bc))
. Обратите внимание на env перед printf! Это снова научит вас, что всегда важно понимать, что вы копируете из других мест.if [
эхо "$ 1/1" | bc` -gt 0] `- есть ли более элегантный способ проверки (кроме парсинга строки для« - »)?Самое простое решение:
источник
+0.5
. Попробуйprintf "%.2f\n" "$(bc -l <<<"48.86/1.18")" "$(bc -l <<<"-48.86/1.18")"
и получишь41.41
и-41.41
.echo "$float/1.18" | bc -l | xargs printf %.2f
bash: printf: 1.69491525423728813559: invalid number
зависимости от локали.Округление Bash / awk:
Если у вас есть Python, вы можете использовать что-то вроде этого:
источник
echo "$float" |awk '{printf "%.2f", $1/1.18}'
выполнит запрошенную математику вопроса с запрошенным разрешением сотых долей. Это столько же "использование bash", сколькоbc
вызов в вопросе.python -c "print(round($num))"
гдеnum=4.678923
. Нет необходимости бродить с stdin. Вы можете также круглые с п цифр нравится так:python -c "print(round($num, $n))"
.echo 5 | python -c "print int(round((float(raw_input())/2)-0.5))"
(Когда + округляется вверх и - округляется вниз).Вот чисто до н.э. Правила округления: +/- 0,5, округление от нуля.
Поместите искомую шкалу в $ result_scale; ваша математика должна быть там, где $ MATH находится в списке команд bc:
источник
MATH=-0.34;result_scale=1;bc <<MATH
, #ObjectiveAndClear: 5, как здесь объяснено :)Я знаю, что это старый вопрос, но у меня есть чистое 'bc' -решение без 'if' или ответвлений:
Используйте это как
bcr '2/3' 5
илиbcr '0.666666' 2
-> (выражение, сопровождаемое масштабом)Это возможно, потому что в bc (например, C / C ++) разрешено смешивать логические выражения в ваших вычислениях. Выражение
((t>0)-(t<0))/2)
будет оцениваться до +/- 0,5 в зависимости от знака 't' и поэтому будет использовать правильное значение для округления.источник
bcr "5 / 2" 0
возвращается2
вместо3
. Я что-то пропустил?Это на самом деле просто: нет необходимости явно добавлять жестко закодированный вариант "-0.5" для отрицательных чисел. Говоря математически, мы просто вычислим абсолютное значение аргумента и добавим 0.5, как обычно. Но так как у нас (к сожалению) нет встроенной
abs()
функции (если мы не кодируем ее), мы просто отменим аргумент, если он отрицательный.Кроме того, оказалось очень громоздким работать с частным как параметром (так как для моего решения я должен иметь доступ к дивиденду и делителю отдельно). Вот почему мой сценарий имеет дополнительный третий параметр.
источник
echo .. |
, арифметика оболочки, какой смыслecho $()
? Это легко объяснить: ваши строки здесь всегда будут требовать доступной для записи/tmp
директории! И мое решение также будет работать на только для чтения окружающей среды, например , аварийно корневой оболочки , где/
это не всегда доступен для записи по умолчанию. Так что была веская причина, почему я так закодировал.echo $()
нужно? Это и отступы побудили меня отредактировать, вот что произошло.echo $()
когда нужно было исправить, был на самом деле предпоследней строкой, смеется. Спасибо за хедз-ап. По крайней мере, теперь это выглядит намного лучше, я не могу отрицать. В любом случае, я любил логику в этом. Множество логических вещей, менее лишних «если» (что наверняка взорвет код на 50 процентов).Я все еще ищу чистый
bc
ответ о том, как округлить только одно значение в функции, но вот чистыйbash
ответ:По сути, это тщательно извлекает десятичные дроби, умножает все на 100 миллиардов (10¹⁰,
10**10
inbash
), корректирует точность и округление, выполняет фактическое деление, делит обратно до соответствующей величины, а затем повторно вводит десятичное число.Шаг за шагом:
В
embiggen()
функции присваивает усечено целым формы его аргумента$int
и сохраняет число после точки в$fraction
. Количество дробных цифр указано в$precision
. В математике умножает 10¹⁰ по конкатенации$int
и ,$fraction
а затем корректирует , что соответствует точности (например ,embiggen 48.86
становится 10¹⁰ × 4886/100 и возврат488600000000
которых является 488600000000).Нам нужна конечная точность в сотых долях, поэтому мы умножаем первое число на 100, добавляем 5 для округления и затем делим второе число. Это назначение
$answer
оставляет нам в сто раз окончательный ответ.Теперь нам нужно добавить десятичную точку. Мы присваиваем новое
$int
значение$answer
исключению двух последних цифр, затемecho
оно ставится точкой и$answer
исключает$int
значение, о котором уже позаботились. (Не берите в голову ошибку подсветки синтаксиса, которая заставляет это походить на комментарий)(Bashism: возведение в степень не является POSIX, так что это bashism. Чистое решение POSIX потребовало бы циклов для добавления нулей, а не использования степеней десяти. Кроме того, «embiggen» - совершенно непонятное слово.)
Одна из основных причин, по которой я использую
zsh
свою оболочку, заключается в том, что она поддерживает математику с плавающей запятой. Решение этого вопроса довольно простое вzsh
:(Я бы хотел, чтобы кто-нибудь добавил комментарий к этому ответу с хитростью, чтобы включить арифметику с плавающей запятой
bash
, но я почти уверен, что такой функции еще не существует.)источник
если у вас есть результат, например, рассмотрите 2.3747888
все, что вам нужно сделать, это:
это округляет число правильно пример:
десятичные дроби удаляются,
bc
и поэтому округляется до 2, как это должно бытьисточник
Мне пришлось рассчитать общую продолжительность коллекции аудиофайлов.
Поэтому мне пришлось:
A. получить продолжительность для каждого файла ( не показан )
B. сложите все длительности (они были в
NNN.NNNNNN
(fp) секундах)C. отдельные часы, минуты, секунды, секунды.
D. Выведите строку HR: MIN: SEC: FRAMES, где frame = 1/75 сек.
(Кадры взяты из кода SMPTE, используемого в студиях.)
A: использовать
ffprobe
и анализировать строку продолжительности в число fp (не показано)B:
C:
D:
источник
Вот сокращенная версия вашего скрипта, исправленная для предоставления желаемого результата:
Обратите внимание, что округление до ближайшего целого равнозначно добавлению .5 и получению слова или округлению вниз (для положительных чисел).
Кроме того, масштабный коэффициент применяется во время работы; Итак (это
bc
команды, вы можете вставить их в свой терминал):источник
Чистая реализация до нашей эры в соответствии с просьбой
define ceil(x) { auto os,xx;x=-x;os=scale;scale=0 xx=x/1;if(xx>x).=xx-- scale=os;return(-xx) }
если вы поместите это в файл с именем functions.bc, то вы можете округлить с
echo 'ceil(3.1415)' | bc functions.bc
Код для реализации bc находится по адресу http://phodd.net/gnu-bc/code/funcs.bc
источник
источник
Вы можете использовать awk, трубы не нужны:
Заранее установите цену с помощью переменной среды
PRICE=<val>
.Затем вызовите awk -
$PRICE
войдет в awk как переменная awkprice
.Затем округляется до ближайшего сотого с +.005.
Параметр форматирования printf
%.2f
ограничивает масштаб до двух десятичных знаков.Если вам нужно сделать это много, то этот способ намного эффективнее, чем выбранный ответ:
источник