linux + ksh + округление вниз или округление вверх - числа с плавающей запятой - PullRequest
4 голосов
/ 08 января 2012

в моем скрипте ksh мне нужно вычислять только целые числа

Иногда я получаю числа с плавающей точкой, такие как 3.49 или 4.8 ... и т. Д.

поэтому мне нужно перевести числа с плавающей точкой в ​​целые числа в соответствии со следующими правилами (примерами)

3.49     will be 3
2.9      will be 3
4.1      will be 4
23.51    will be 24
982.4999 will be 982

10.5     will be 11  ( this example if float is .5 then it will roundup )

Посоветуйте, пожалуйста, как это сделать в ksh или awk или perl

или

любой другой язык, который может быть запущен в моем скрипте ksh

Ответы [ 4 ]

4 голосов
/ 08 января 2012

В awk вы можете использовать функцию int(), чтобы обрезать значения числа с плавающей запятой, чтобы сделать его целым числом.

[jaypal:~/Temp] cat f
3.49     will be 3
2.9      will be 3
4.1      will be 4
23.51    will be 24
982.4999 will be 982

[jaypal:~/Temp] awk '{x=int($1); print $0,x}' f
3.49     will be 3 3
2.9      will be 3 2
4.1      will be 4 4
23.51    will be 24 23
982.4999 will be 982 982

Для округления вы можете сделать что-то вроде этого -

[jaypal:~/Temp] awk '{x=$1+0.5; y=int(x); print $0,y}' f
3.49     will be 3 3
2.9      will be 3 3
4.1      will be 4 4
23.51    will be 24 24
982.4999 will be 982 982

Примечание: я не уверен, как бы вы хотели обработать numbers like 2.5.Вышеуказанный метод вернет 3 for 2.5.

4 голосов
/ 08 января 2012

После короткого сеанса Google я обнаружил, что printf, кажется, может выполнить эту работу, по крайней мере, в bash (не удалось найти онлайн-переводчика, который делает ksh).

printf "%0.f\n" 4.51
5
printf "%0.f\n" 4.49
4

Код в: http://ideone.com/nEFYF

Примечание: perl может быть излишним, как говорит Мариус, но вот способ perl:

Модуль perl Math :: Round кажетсясправиться с работой.

Однострочник:

perl -MMath::Round -we 'print round $ARGV[0]' 12.49

Сценарий:

use v5.10;
use Math::Round;
my @list = (3.49, 2.9, 4.1, 23.51, 982.4999);

say round $_ for @list;

Сценарийвывод:

3
3
4
24
982
1 голос
/ 09 января 2012

Версии ksh, которые выполняют нецелую математику, вероятно, имеют функции floor (), trunc () и round (). Не могу проверить их все, но по крайней мере на моем Mac (Lion) я получаю это:

$ y=3.49
$ print $(( round(y) ))
3
$ y=3.51
$ print $(( round(y) ))
4
$ (( p = round(y) ))
$ print $p
4
$
0 голосов
/ 08 января 2012

В perl, my $i = int($f+0.5);.Должны быть похожими в другом, предполагая, что у них есть функция преобразования в целое число или функцию пола.Или, как в javascript, они имеют функцию Math.round, которую можно использовать напрямую.

...