linux+;ksh+;向下四舍五入或向上四舍五入-浮点数

linux+;ksh+;向下四舍五入或向上四舍五入-浮点数,linux,perl,shell,awk,ksh,Linux,Perl,Shell,Awk,Ksh,在我的ksh脚本中,我只需要计算整数 有时我会得到浮点数,比如3.49或4.8…等等 因此,我需要根据以下规则(示例)将浮点数转换为整数 请建议如何在ksh、awk或perl中执行此操作 或 可以在我的ksh脚本中运行的任何其他语言,在perl中,my$i=int($f+0.5)。另一个应该类似,假设它们有一个转换为整数或floor函数。或者,如果与javascript类似,它们有一个可以直接使用的Math.round函数。在awk中,可以使用int()函数截断浮点数的值,使其成为整数 [jay

在我的ksh脚本中,我只需要计算整数

有时我会得到浮点数,比如3.49或4.8…等等

因此,我需要根据以下规则(示例)将浮点数转换为整数

请建议如何在ksh、awk或perl中执行此操作


可以在我的ksh脚本中运行的任何其他语言,在perl中,
my$i=int($f+0.5)。另一个应该类似,假设它们有一个转换为整数或floor函数。或者,如果与javascript类似,它们有一个可以直接使用的
Math.round
函数。

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
最后你可以做这样的事情-
注意:我不确定您希望如何处理像2.5这样的
数字。上面的方法将返回
3 for 2.5
在一个简短的google会话后,我发现
printf
似乎能够完成这项工作,至少在bash中是这样(找不到一个在线解释器来执行ksh)

代码位于:

注意:正如马吕斯所说,perl可能有些过分,但这里有一种perl方法:

perl模块似乎可以处理这项工作

一行:

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
脚本:

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
脚本输出:

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

进行非整数运算的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
$

如何在ksh脚本中运行此perl语法?ROUNDED=$(perl-e'print int($ARGV[0]+0.5)’$REALVALUE)将在scriptFor bash中实现这一点,您可以转到并搜索“Round floating point number”,并找到一个同样使用printf的解决方案。可能类似于ksh。啊,我的错…那么如果它是
2.5
,那么值应该是什么呢?你必须问一下运算。数学::Round似乎是“向无穷大”舍入,即正数向上,负数向下。你没有给出“规则”,只是示例。他们留下了一个明显的问题没有回答,即小数部分为.500时如何舍入?THX对于您的评论,请参阅我的更新问题为什么不使用
printf“%0.f\n”,美元表示@list应该是
Perl-nwe'printf“%0.f\n”,也许是$\u'
。直接使用
printf
更短,而且一次只处理一个参数,这听起来像是OP想要的。@TLP:我甚至没有注意到您的Perl one liner。如果有,我会建议您将其替换为
perl-e'printf“%0.f\n”,shift'12.49
。我的意思是,为什么要使用
Math::Round
来完成这样一个简单的任务,而Perl的
printf
的行为与shell示例中的C等价物完全相同?