代码之家  ›  专栏  ›  技术社区  ›  Brian Carlton

在Perl中,如何限制小数点后的位数,但没有尾随的零?

  •  5
  • Brian Carlton  · 技术社区  · 15 年前

    "dropping trailing ‘.0’ from floats" ,但对于Perl和,小数点后有最大位数。

    我正在寻找一种将数字转换为字符串格式的方法,删除任何多余的“0”,包括不仅仅是小数点后的数字。并且仍然具有最大数字量,例如3

    输入数据是浮动的。期望输出:

    0         -> 0
    0.1       -> 0.1
    0.11      -> 0.11
    0.111     -> 0.111
    0.1111111 -> 0.111
    
    4 回复  |  直到 7 年前
        1
  •  19
  •   Tim Cooper    13 年前

    直接使用以下命令:

    my $s = sprintf('%.3f', $f);
    $s =~ s/\.?0*$//;
    
    print $s
    

    …或定义一个子例程以更一般地执行此操作:

    sub fstr {
      my ($value,$precision) = @_;
      $precision ||= 3;
      my $s = sprintf("%.${precision}f", $value);
      $s =~ s/\.?0*$//;
      $s
    }
    
    print fstr(0) . "\n";
    print fstr(1) . "\n";
    print fstr(1.1) . "\n";
    print fstr(1.12) . "\n";
    print fstr(1.123) . "\n";
    print fstr(1.12345) . "\n";
    print fstr(1.12345, 2) . "\n";
    print fstr(1.12345, 10) . "\n";
    

    0
    1
    1.1
    1.12
    1.123
    1.123
    1.12
    1.12345
    
        2
  •  3
  •   Ryan Bright    15 年前

    你也可以使用 Math::Round 为此:

    $ perl -MMath::Round=nearest -e 'print nearest(.001, 0.1), "\n"'
    0.1
    $ perl -MMath::Round=nearest -e 'print nearest(.001, 0.11111), "\n"'
    0.111
    
        3
  •  3
  •   HoldOffHunger Lux    4 年前

    你可以用 sprintf 与…结合 eval

    my $num = eval sprintf('%.3f', $raw_num);
    

    #!/usr/bin/perl 
    
    my @num_array = (
        0, 1, 1.0, 0.1, 0.10, 0.11, 0.111, 0.1110, 0.1111111
    );
    
    
    for my $raw_num (@num_array) {
        my $num = eval sprintf('%.3f', $raw_num);
        print $num . "\n";
    }
    

    产出:

    0
    1
    1
    0.1
    0.1
    0.11
    0.111
    0.111
    0.111
    
        4
  •  0
  •   HoldOffHunger Lux    4 年前

    sub dropTraillingZeros{
    $_ = shift;
    s/(\d*\.\d{3})(.*)/$1/;
    s/(\d*\.\d)(00)/$1/;
    s/(\d*\.\d{2})(0)/$1/;
    print "$_\n";
    }
    dropTraillingZeros(0);
    dropTraillingZeros(0.1);
    dropTraillingZeros(0.11);
    dropTraillingZeros(0.111);
    dropTraillingZeros(0.11111111);
    
    推荐文章