我不确定我是否在标题中清楚地解释了我的问题,基本上我需要这样的地板/电池功能:
sub ceil($num)
ceil(120) = 200
ceil(12) = 20
ceil(1.2) = 2
ceil(0.12) = 0.2
ceil(0.012) = 0.02
ceil(0.00000012) = 0.0000002
同样适用于负数(输入和输出均为负号)
谢谢!
答案 0 :(得分:3)
sub floor {
my $a = shift;
$a =~ s/([1-9])(\d*)(?:\.\d*)?/$1.("0"x length($2))/e;
0 + $a;
}
sub ceil {
my $a = shift;
my $f = floor($a);
$f =~ s/([1-9])/1+$1/e if abs($a) > abs($f);
0 + $f;
}
并测试:
$ perl -E'sub floor {my $a = shift; $a=~s/([1-9])(\d*)(?:\.\d*)?/$1.("0"x length($2))/e; 0+$a} sub ceil {my $a = shift;my $f = floor($a); $f=~s/([1-9])/1+$1/e if abs($a) > abs($f); 0+$f} printf "%10g %10g %10g\n", $_, floor($_), ceil($_) for (120, 12, 1.2, 0.12, 0.012, 200, 20, 0.2, -120, -12, -0.12, -0.2,0, 1.2e12, -1.2e-12)'
120 100 200
12 10 20
1.2 1 2
0.12 0.1 0.2
0.012 0.01 0.02
200 200 200
20 20 20
0.2 0.2 0.2
-120 -100 -200
-12 -10 -20
-0.12 -0.1 -0.2
-0.2 -0.2 -0.2
0 0 0
1.2e+12 1e+12 2e+12
-1.2e-12 -1e-12 -2e-12
答案 1 :(得分:1)
这可能有用吗?我没有测试过,但我认为逻辑就在那里。
步骤1我们找到最接近的10的幂(将其分配给“$ base”)
步骤2我们确定$ num是否可以被这个基础干净地分解
步骤2.1如果是,请返回
步骤2.2如果不是,则减去模数并加1
$base = 10*floor(log($num,10));
return ($num % $base)?($num - ($num%$base) + 1):$num;
数学不是我最强的东西,所以可以有更好的方法去