Perl划分为JavaScript提供了不同的结果
在Perl中,我将两个数字相除,因此:Perl划分为JavaScript提供了不同的结果,perl,Perl,在Perl中,我将两个数字相除,因此: 838041641/908376077 这给出了以下的Perl答案: 0.922571236978976 但如果你把它放在计算器(或使用JavaScript)中,答案是: 0.9225712369789765 我需要它来匹配JavaScript的答案。有没有办法做到这一点 另一个例子是: 838041641/152508066=5.49506437908668(计算器=5.495064379086677)似乎您想要舍入到16位有效数字。您可以使用%g进行此
838041641/908376077
这给出了以下的Perl答案:
0.922571236978976
但如果你把它放在计算器(或使用JavaScript)中,答案是:
0.9225712369789765
我需要它来匹配JavaScript的答案。有没有办法做到这一点
另一个例子是:
838041641/152508066=5.49506437908668
(计算器=5.495064379086677
)似乎您想要舍入到16位有效数字。您可以使用%g
进行此操作
$ perl -le'printf "%.16g\n", 838041641/908376077'
0.9225712369789765
$ perl -le'printf "%.16g\n", 838041641/152508066'
5.495064379086677
请注意,
%g
使用科学符号表示非常大和非常小的数字。如果这是不可接受的,我们可以使用%e
来始终获得科学符号,并使用字符串操作来更正格式,而不会引入数字错误
sub round_to_16_sig_digits {
my ($n) = @_;
my $str = sprintf("%.15e", $n);
$str =~ /^(-?)(\d)\.(\d+)e(.*)/saa or die "!!!";
my $sign = $1;
$str = $2 . $3;
my $e = $4;
my $decimals = 15 - $e;
if ($decimals > 0) {
$str = ("0" x ($decimals-15)) . $str if $decimals > 15;
substr($str, -$decimals, 1, ".");
$str =~ s/^0+\./0./;
$str =~ s/\.?0*\z//;
} else {
$str .= "0" x (-$decimals);
}
return $sign . $str;
}
比如说,
say round_to_16_sig_digits($_)
for
838041641/908376077,
838041641/152508066;
输出
0.9225712369789765
5.495064379086677
请注意,double(Perl和JavaScript使用)的精度略低于16位(log10(253)=15.95…),因此JavaScript发明了实际上不存在的信息,这就是为什么Perl将精度舍入到15位的原因。您不能只使用
%.16g
?@ysth,也许吧,但它有时会返回“e”符号。我将补充我的答案。