如何在Perl或任何语言中舍入到小数的第一个左数字?

时间:2013-12-12 15:31:01

标签: perl numbers rounding

我不确定我是否在标题中清楚地解释了我的问题,基本上我需要这样的地板/电池功能:

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

同样适用于负数(输入和输出均为负号)

谢谢!

2 个答案:

答案 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;

数学不是我最强的东西,所以可以有更好的方法去