Как округлить или преобразовать значение float в int с помощью bc? получение: "(standard_in) 1: синтаксическая ошибка"

Я получу значение как 2743410360.320, и я хочу значение, подобное 2743410360, переменной.

Я пытался

INTValueOfGB=$ echo "($gb+0.5)/1" | bc 

Но я получаю (standard_in) 1: syntax error

  • Переместить файлы обратно по 2 директориям
  • Задача Cron за каждую минуту выходить из строя?
  • Eval для имен файлов, зло?
  • почему существует случайное поведение для фоновой работы?
  • Как добавить заголовок лицензии рекурсивно для всех файлов .h и .cpp в каталоге
  • Как сгладить журналы для списка шаблонов и сделать из него отчет?
  • Как удалить первые n строк файла ascii с помощью команд оболочки?
  • Каков эквивалент bash команды cmdlet?
  • 4 Solutions collect form web for “Как округлить или преобразовать значение float в int с помощью bc? получение: "(standard_in) 1: синтаксическая ошибка"”

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

     $ printf "%.0f" 2743410360.320 
     $ p=2743410360.320 $ echo $p 2743410360.320 $ echo ${p%%.*} 2743410360 

    Я не вижу ответа на проблему @ vin, а именно:

    Но я получаю (standard_in) 1: syntax error

    Команда bc печатает (standard_in) 1: syntax error так как переменная оболочки gb не установлена:

     $ unset gb $ echo "($gb+0.5)/1" | bc (standard_in) 1: syntax error $ gb=2743410360.320 $ echo "($gb+0.5)/1" | bc 2743410360 

    В комментариях к ответу @ dchirikov @vin говорит, что printf "%.0f" «не работает»:

     $ unset gb $ printf '%.0f\n' $gb 0 $ gb=2743410360.320 $ printf '%.0f\n' $gb 2743410360 

    В обеих областях, где @vin имеет проблемы, неустановленная переменная воспроизводит проблему, и установка переменной решает проблему.

    Для вашей команды требуется пара ( ) :

     INTValueOfGB=$( echo "($gb+0.5)/1" | bc ) 

    Но это не будет округлять число, для этого вам нужно установить масштаб на 0:

     INTValueOfGB=$( echo "scale=0;($gb+0.5)/1" | bc ) 

    Это округляет (от x.5) до следующего целого.

    Чтобы получить «round to next even integer» (правило Banker), вам нужно использовать округление printf:

     LC_NUMERIC=C printf "%.0f" 2743410360.320 

    LC_NUMERIC должен обеспечить, чтобы числа обрабатывались с точкой как десятичной. Это не то, что пользователи в Германии хотели бы использовать, это должно работать с десятичными знаками с:

     $ LC_NUMERIC=de_DE.utf8 printf "%.0f" 2743410360,320 2743410360 
    Linux и Unix - лучшая ОС в мире.