Правильный ли это способ преобразования чисел с плавающей точкой в bash? Есть ли другой метод?
flotToint() {
printf "%.0f\n" "$@"
}
bash
floating-point
Рахул Патил
источник
источник
%.0f
будет округлять вверх или вниз. Это то, что вы хотите? Вы можете использоватьprintf "%d\n" "$@" 2>/dev/null
для измельчения дроби.Ответы:
удар
В
bash
, это, вероятно, так же хорошо, как это получается. Это использует встроенную оболочку. Если вам нужен результат в переменной, вы можете использовать подстановку команд илиbash
конкретный (хотя теперь также поддерживаетсяzsh
):Вы могли бы сделать:
Но это уберет дробную часть вместо того, чтобы дать вам ближайшее целое число, и это не сработает для значений
$float
like1.2e9
или,.12
например.Также обратите внимание на возможные ограничения из-за внутреннего представления чисел:
Вы получаете целое число, но есть вероятность, что вы нигде не сможете его использовать.
Кроме того, как отмечает @BinaryZebra, в нескольких
printf
реализациях (bash, ksh93, yash, а не GNU, zsh, dash) на него влияет локаль (десятичный разделитель, который может быть.
или,
).Итак, если ваши значения с плавающей точкой всегда выражаются точкой в качестве десятичного разделителя, и вы хотите, чтобы он обрабатывался как таковой
printf
независимо от языкового стандарта пользователя, вызывающего ваш скрипт, вам нужно будет установить языковой стандарт на C:С помощью
yash
вы также можете сделать:(Смотри ниже).
POSIX
не POSIX, так как
%f
не требуется для поддержки POSIX.POSIXly, вы можете сделать:
На него не влияет языковой стандарт (запятая не может быть десятичным разделителем,
awk
поскольку там уже есть специальный символ в синтаксисе (print 1,2
аналогичноprint 1, 2
передаче двух аргументовprint
)ЗШ
В
zsh
(которая поддерживает арифметику с плавающей запятой (десятичный разделитель всегда является точкой)), у вас естьrint()
математическая функция, которая дает вам ближайшее целое число в виде числа с плавающей запятой (как вC
) иint()
дает вам целое число из числа с плавающей запятой (как вawk
). Так что вы можете сделать:Или же:
Однако обратите внимание, что хотя
double
s может представлять очень большие числа, целые числа гораздо более ограничены.ksh93
ksh93 была первой подобной Борну оболочкой, которая поддерживает арифметику с плавающей запятой. ksh93 оптимизирует подстановку команд, не используя канал или разветвление, когда команды являются только встроенными командами. Так
не развивается Или даже лучше:
который также не работает, но также не создает проблем при создании поддельной оболочки.
Вы также можете сделать:
Но остерегайтесь:
Вы также можете сделать:
Но, как для
zsh
:Помните, что
ksh93
арифметика с плавающей запятой учитывает настройку десятичного разделителя в локали (хотя,
в противном случае это математический оператор ($((1,2))
будет 6/5 во французской / немецкой ... локали, и то же самое$((1, 2))
, что 2 в английской локали) ,йаш
йаш также поддерживает арифметику с плавающей , но не имеет математические функции , такие как
ksh93
/zsh
«srint()
. Вы можете преобразовать число в целое число, используя, например, двоичный файл или оператор (также работает в,zsh
но не вksh93
). Обратите внимание, что он усекает десятичную часть, но не дает ближайшего целого числа:yash
учитывает десятичный разделитель локали при выводе, но не для литеральных констант с плавающей запятой в их арифметических выражениях, что может вызвать неожиданность:Это хорошо в том смысле, что вы можете использовать константы с плавающей запятой в ваших скриптах, которые используют точку, и вам не нужно беспокоиться о том, что она перестанет работать в других локалях, но при этом сможете обрабатывать числа, выраженные пользователем до тех пор, пока как вы не забыли сделать:
источник
int=${float%.*}
очень хорошо работал в моем скрипте bash (версия 3.2.57 (1) -релиз) на Mac (версия 10.13.4 (17E199)).,
десятичное число. Смотрите раздел оLC_ALL=C
bc
- язык калькулятора произвольной точностиint (float) должен выглядеть так:
Для округления лучше использовать это:
Пример:
источник
float=-2; echo "($float+0.5)/1" | bc
дает-1
.Предыдущий ответ был почти верным: «Вы можете сделать:
Но это уберет дробную часть вместо того, чтобы дать вам ближайшее целое число, и это не сработает для значений $ float, таких как, например, 1.2e9 или .12 .... "
Просто используйте
${float%%.*}
.источник
Очень простой взломанный
Образец вывода
источник
sed
, ноcut
решение проще. Я предпочитаюsed
илиcut
как они ИМХО более доступны на встроенных целях , чемawk
(что по- прежнему довольно часто черезbusybox
чемbc
).Связанный:
Дополняя ответ Стефана Шазеля
awk
:источник
printf
делает Bash , или есть какая-то другая причина, чтобы предпочесть awk встроенномуprintf
.