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 бути на прийнятій відповіді, а не на запитання? Поки я не прочитав відповідь, я поняття не мав, на що йдеться у цьому коментарі.
Вілсон F

1
@WilsonF Додав посилання на відповідь.
Адам Матан

2
@Wok, це не залежить від ділення чи множення. Це залежить від введення - найбільше число точності визначає точність на виході. Зверніть увагу, як 1234*1.0вам дадуть1234.0
Richlv

Відповіді:


70

Встановити scaleспеціальну змінну:

$ echo "scale=2; 100/3" | bc
33.33

3
Дивіться коментар @ Вока до цього питання.
Адам Матан

$ echo "scale=2; (100/180)*180" | bcдає 99,00 :(
Донатас Ольсевічус

@ DonatasOlsevičius це тому, що (100/180) = 0,55, а потім (0,55 * 180) = 99. Отже, це дає вам правильне значення :)
Kamaldeep singh Bhatia

Було б непогано, якби він округлився, якщо вище .5. ~$ echo "scale=2; 12/104" | bc .11 Якби округлили, це було б .12. Однак він все-таки повинен виконати роботу для мого завдання.
jbrock

3
Ви не можете підтримувати точність до роздруковувати наступним чином: echo "result = (100/180) * 180; scale=2; result / 1" | bc -l. Тепер ви отримаєте 99.99.
Байрон Хокінс

10

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" | 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 десяткових числа - (НІМЕР * 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.