2014-10-20 2 views
15

Итак, я пытаюсь округлить вход 17.92857, так что он получает вход 17.929 в bash.Округление чисел с плавающей точкой bash

Мой код до сих пор:

read input 
echo "scale = 3; $input" | bc -l 

Однако, когда я использую это, не сгонять, она возвращает 17.928.

Кто-нибудь знает какие-либо решения?

+0

[смотреть на это] (http://stackoverflow.com/a/2395601/3913686) –

+0

Вы можете использовать 'printf -v output '% .3f \ n" "$ input", чтобы назначить вывод printf переменной $ output. – Cyrus

+0

Должно поступать из hackerrank (https://www.hackerrank.com/challenges/bash-tutorials---arithmetic-operations) – bergie3000

ответ

19

В случае, если input содержит номер, нет необходимости в внешней команде, такой как bc. Вы можете просто использовать printf:

printf "%.3f\n" "$input" 

Edit: В случае ввода формула, вы должны, однако использовать bc как в одной из следующих команд:

printf "%.3f\n" $(bc -l <<< "$input") 
printf "%.3f\n" $(echo "$input" | bc -l) 
+0

Я продлил свой ответ, посмотрим, работает ли он на вас. –

1

Маленькая хитрость заключается в добавьте 0.0005 на ваш вход, таким образом, вы правильно проведете свой номер.

+0

Или как @Tim сказал use printf –

+0

Если вы округлите до трех мест, вы должны фактически добавить '.0005', а не' .005'. Но почему вы не можете это сделать? –

+0

Я отредактировал мой ответ, спасибо! –

-2

, если вы получаете ошибку округления с номером 17.928 попробовать это: чтения у v = echo "scale = 3; $y" |bc -l если [$ v == 17,928]; то эхо "17,929" еще эхо $ v фи

0

Вы можете написать вспомогательную функцию оболочки round ${FLOAT} ${PRECISION} для этого:

#!/usr/bin/env bash 

round() { 
    printf "%.${2}f" "${1}" 
} 

PI=3.14159 

round ${PI} 0 
echo 
round ${PI} 1 
echo 
round ${PI} 2 
echo 
round ${PI} 3 
echo 
round ${PI} 4 
echo 
round ${PI} 5 
echo 
round ${PI} 6 
echo 

# Outputs: 
3 
3.1 
3.14 
3.142 
3.1416 
3.14159 
3.141590 

# To store in a variable: 
ROUND_PI=$(round ${PI} 3) 
echo ${ROUND_PI} 

# Outputs: 
3.142 
Смежные вопросы