如何在perl中以十进制形式而不是指数形式打印

时间:2014-05-26 14:14:55

标签: perl decimal exponential

我在perl编写了一个程序。我的要求是只打印十进制数字,而不是指数数字。你能告诉我如何实现这个吗? 我的程序正在计算表达式1/2 power(n),其中n只能占用1到200之间的整数。只打印100行。

实施例: N = 1,打印0.5 N = 2,打印0.25

我的程序如下:

   #!/usr/bin/perl
   use strict;
   use warnings;
   my $exp;
   my $num;
   my $count_lines = 0;
   while($exp = <>)
   {
        next if($exp =~ m/^$/);
        if($exp > 0 and $exp <=200 and $count_lines < 100)
        {
            $num = 1/(2 ** $exp);
            print $num,"\n";
            $count_lines++;
       }
  }

输入值: 如果N = 100,那么out将以指数形式打印。但是,要求是它应该以十进制形式打印。

3 个答案:

答案 0 :(得分:2)

一个简单的print将选择“最佳”格式来显示该值,因此它会为非常大或非常小的数字选择科学格式,以避免打印一长串零。

但您可以使用printf(格式说明符记录为here)来格式化您想要的数字。

0.5 200 是一个非常小的数字,所以你需要大约80个小数位

use strict;
use warnings;

while (my $exp = <>) {

  next unless $exp =~ /\S/;
  my $count_lines = 0;

  if ($exp > 0 and $exp <= 200 and $count_lines < 100) {
    my $num = 1 / (2 ** $exp);
    printf "%.80f\n", $num;
    $count_lines++;
  }
}
100

输出

0.00000000000000000000000000000078886090522101181000000000000000000000000000000000

和200

0.00000000000000000000000000000000000000000000000000000000000062230152778611417000

如果您想删除无关紧要的尾随零,那么您可以使用sprintf将格式化的数字放入变量中,然后使用s///删除尾随零,就像这样

my $number = sprintf "%.80f", $num;
$number =~ s/0+$//;
print $number, "\n";

给出了

0.00000000000000000000000000000078886090522101181

0.00000000000000000000000000000000000000000000000000000000000062230152778611417

注意计算的真实值比此数字多得多,结果的准确性受计算机使用的浮点值的大小限制。

答案 1 :(得分:1)

0.5 ^ 200对于双浮点数而言太小,您需要使用Math::BigFloat,这将为您重载基本数学运算和输出运算符,例如print,例如:

#!/usr/bin/perl

use strict;
use warnings;

use Math::BigFloat;

my $x = Math::BigFloat->new('0.5');
my $y = Math::BigFloat->new('200');

print $x ** $y, "\n";

或使用bignum

#!/usr/bin/perl

use strict;
use warnings;

use bignum;

print 0.5 ** 200, "\n";

输出:

$ perl t.pl 
0.00000000000000000000000000000000000000000000000000000000000062230152778611417071440640537801242405902521687211671331011166147896988340353834411839448231257136169569665895551224821247160434722900390625

答案 2 :(得分:0)

您可以使用printfsprintf指定要打印的格式。

#!/usr/bin/perl

use strict;
use warnings;

my $num = 0.000000123;

printf("%.50", $num)

如果您需要类似Perl 5格式的内容,请查看Perl6::Form(注意,这是一个Perl 5模块,它只是实现了建议的Perl 6格式)。