bc: установить количество цифр после десятичной точки

52

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

# echo "100/3" | bc
33

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

# echo "100/3" | bc -l
33.33333333333333333333

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

Адам Матан
источник
10
Интересно, что это работает только с делением. Если вы хотите сделать scale=0;1234*1.1, вы должны написать, как scale=0;1234*1.1/1получить 1357. В противном случае, независимо от значения scale, вы получите 1357.4.
Вок
Разве комментарий @Wok не должен касаться принятого ответа, а не вопроса? Пока я не прочитал ответ, я понятия не имел, на что ссылался этот комментарий.
Уилсон Ф
1
@WilsonF Добавлена ​​ссылка на ответ.
Адам Матан
2
@ Wok, это не зависит от деления или умножения. Это зависит от входных данных - наибольшее число точности определяет точность на выходе. Обратите внимание, что 1234*1.0даст вам1234.0
Richlv

Ответы:

71

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

$ echo "scale=2; 100/3" | bc
33.33
chronitis
источник
3
Смотрите комментарий @ Wok ​​по этому вопросу.
Адам Матан
$ echo "scale=2; (100/180)*180" | bcдает 99.00 :(
Донатас Олсявичюс
@ DonatasOlsevičius это потому, что (100/180) = 0,55, а затем (0,55 * 180) = 99. Так что это дает вам правильное значение :)
Камалдип Сингх Бхатия
Было бы неплохо, если бы округлили, если выше .5. ~$ echo "scale=2; 12/104" | bc .11 Если округлить это было бы .12. Тем не менее, он все равно должен выполнить работу для моей задачи.
Джоброк
3
Вы не можете поддерживать точность до распечатывающих следующим образом: echo "result = (100/180) * 180; scale=2; result / 1" | bc -l. Теперь вы получаете 99.99.
Байрон Хокинс,
11

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

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

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

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

  2. Использование Scaleкак указано**chronitis**

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

    $ echo "0.232 * 1000" | bc
    232.000
    
    $ echo "0.232 * 1000 / 1" | bc
    232
    
САГАР Наир
источник
Обратите внимание, что, как я уже упоминал в своем комментарии к вопросу, это вызвано не умножением, а входными числами, имеющими десятичную часть. Или, другими словами, число с «самой длинной» десятичной частью будет определять, сколько десятичных разрядов будет иметь выход.
Richlv
4

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

echo "scale=2; 1.0150876" | bc

Возвращает

1.0150876

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

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

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

1.01
Михал Змуда
источник
3

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

# printf "%.3f\n" $(echo "100/3" | bc -l)
3.333
Рохит Кхуне
источник
2

Округлять

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

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12
Spanky
источник