Bc: заданное количество цифр после десятичной точки

bc обрабатывает числа как целые числа:

# echo "100/3" | bc33

bc -l обрабатывает числа как объекты с плавающей запятой:

# echo "100/3" | bc -l33.33333333333333333333

Есть ли способ ограничить количество цифр после десятичной точки?

Попробуй пройти бота-учителя. Он научит тебя Linux в виде игры: Курсы Linux и DevOPS Бесплатный урок

Установите scale специальная переменная:

$ echo "scale=2; 100/3" | bc33.33

Попробуй пройти бота-учителя. Он научит тебя Linux в виде игры: Курсы Linux и DevOPS Бесплатный урок

scale работает только для деления; если некоторым гикам это нужно при умножении, то вы можете добиться этого с помощью манипуляций со строками.Скажите, нужно ли вам умножать 32 * 0.60 , ответ таков 19.20. Если вам нужно получить его только 19 в ответе, вы можете получить его разными способами.

  1. Использование манипуляций со строками

    $ S=$(echo "32*.60" | bc ) ; echo ${S%.*}19

    Синтаксис манипулирования строками: ${Variable%pattern}, это приведет к удалению короткого совпадающего шаблона, который появляется после %. Дополнительные сведения о манипулировании строками см. в разделе Расширенное руководство по написанию сценариев Bash.

  2. С помощью Scale как заявил **chronitis**

    $ echo "scale=0; 32*60/100" | bc19
  3. Чтобы избавиться от конечных 0, вместо манипулирования строками можно также выполнить деление на 1.

    $ echo "0.232 * 1000" | bc232.000$ echo "0.232 * 1000 / 1" | bc232

В дополнение к предыдущим ответам

echo "scale=2; 1.0150876" | bc

Возвращается

1.0150876

Добавьте математические операции, чтобы получить только 2 десятичных числа - (ЧИСЛО * 100)/100

echo "scale=2; (1.0150876 * 100) / 100" | bc

Теперь возвращается

1.01

вы также можете использовать команду printf для округления результата до 3 десятичных знаков

# printf "%.3f\n" $(echo "100/3" | bc -l)3.333

Округление

scale = 2 усекает ответ до двух десятичных цифр, но мы можем добиться округления следующим образом:

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l.12

Интересно, что это работает только с разделением. Если вы хотите сделать scale=0;1234*1.1, вы должны записать его как scale=0;1234*1.1/1 чтобы получить 1357. В противном случае, независимо от значения scale, вы получите 1357.4.

@Wok, это не зависит от деления или умножения. Это зависит от входных данных - наибольшее число точности определяет точность на выходе. Обратите внимание, как “1234*1.0” даст вам "1234.0`

Разве комментарий @Wok не должен касаться принятого ответа, а не вопроса? Пока я не прочитал ответ, я понятия не имел, к чему относится этот комментарий.

@WilsonF Добавил ссылку на ответ.

Попробуй пройти бота-учителя. Он научит тебя Linux в виде игры: Курсы Linux и DevOPS Бесплатный урок