我可以在Perl中为sprintf指定数字的最大精度宽度吗?

时间:2012-11-16 16:10:51

标签: perl

是否可以使用Perl的sprintf函数指定浮点数的最大精度宽度?阅读文档后,我相信不是,但可能是我忽略了一些东西。

所以,如果我有4.12,我希望将数字格式化为4.12

my $abc = 4.12;
my $out = sprintf("%?...", $abc); # $out eq '4.12';

然而,如果数字的精度超过6位数,我只需要6位数字:

my $def = 1.23456789;
my $out = sprintf("%?...", $def); # $out eq '1.234568';

这可以用sprintf吗?

修改

Currentyl,我正在使用

sub output_number {
  my $number = shift;

  my $ret = sprintf("%.6f", $number);

  $ret =~ s/0*$//g;
  $ret =~ s/\.$//g;

  return $ret;
}

为了我的目的,这就是我需要的。但我希望有一种更优雅的方式。优选地,一个衬里,不一定限于使用sprintf

另请注意,建议的printf ("%.7g", $number)行为不符合我的要求(例如$n = 0.00000000001;

1 个答案:

答案 0 :(得分:4)

我相信你可以使用%.<n>g

perl -e 'printf "%.7g", 4.12'          =>   4.12
perl -e 'printf "%.7g", 4.12345678'    =>   4.123457

但是如果指数表示法真的毁了你的一天,并且你安装的perl足够现代,总会有

sprintf("%.6f",$number) =~ s/\.?0+$//r