Как к раунду или преобразовывают значение плавающее в интервал с до н.э? получение: “(standard_in) 1: синтаксическая ошибка”

Вы могли использовать ts сценарий жемчуга от moreutils:

$ echo test | ts %F-%H:%M:%.S
2012-11-20-13:34:10.731562 test

2
01.11.2015, 23:27
4 ответа

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

$ printf "%.0f" 2743410360.320
5
27.01.2020, 21:51
  • 1
    В bash 4.1 встроенное printf говорит “неверный номер”. Хорошо работает с /usr/bin/printf. –  manatwork 15.11.2013, 13:39
  • 2
    @manatwork для меня с ударом 4.1.5 на Debian сжимают и даже колотят 3.2.39 на Ubuntu 8.04. –  Gilles 'SO- stop being evil' 17.11.2013, 00:18
  • 3
    Действительно. Хорошо работает в bash 4.2. Или возможно проблемой не была версия – первая попытка была на Cygwin. –  manatwork 17.11.2013, 14:36
  • 4
    я попробовал его, не хорошо работает, когда я передаю $ значения printf "%.0f" $gb –  vin 18.11.2013, 07:58
  • 5
    @manatwork: Вы используете %i или %.0f? Первый говорит 'неверный номер' для меня, последних работ. –  Flimzy 06.03.2015, 17:14
$ p=2743410360.320
$ echo $p
2743410360.320
$ echo ${p%%.*}
2743410360
2
27.01.2020, 21:51
  • 1
    +0.5 в исходном коде похож на округление, необходим. –  manatwork 15.11.2013, 13:36
  • 2
    эффективный код "MBR" –  3kstc 08.08.2016, 07:04

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

Но я получаю (standard_in) 1: синтаксическая ошибка

Команда bc выводит (standard_in) 1: синтаксическая ошибка , поскольку переменная оболочки 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, неустановленная переменная воспроизводит проблему, а установка переменной решает проблема.

1
27.01.2020, 21:51

Вашей команде нужна пара ( ):

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

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

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

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

Чтобы получить "округление до следующего четного целого числа" (правило банкира), нужно использовать округление printf:

LC_NUMERIC=C printf "%.0f" 2743410360.320

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

$ LC_NUMERIC=de_DE.utf8 printf "%.0f" 2743410360,320
2743410360
0
27.01.2020, 21:51

Теги

Похожие вопросы