我在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将以指数形式打印。但是,要求是它应该以十进制形式打印。
答案 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)
#!/usr/bin/perl
use strict;
use warnings;
my $num = 0.000000123;
printf("%.50", $num)
如果您需要类似Perl 5格式的内容,请查看Perl6::Form
(注意,这是一个Perl 5模块,它只是实现了建议的Perl 6格式)。