Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl划分为JavaScript提供了不同的结果_Perl - Fatal编程技术网

Perl划分为JavaScript提供了不同的结果

Perl划分为JavaScript提供了不同的结果,perl,Perl,在Perl中,我将两个数字相除,因此: 838041641/908376077 这给出了以下的Perl答案: 0.922571236978976 但如果你把它放在计算器(或使用JavaScript)中,答案是: 0.9225712369789765 我需要它来匹配JavaScript的答案。有没有办法做到这一点 另一个例子是: 838041641/152508066=5.49506437908668(计算器=5.495064379086677)似乎您想要舍入到16位有效数字。您可以使用%g进行此

在Perl中,我将两个数字相除,因此:

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”符号。我将补充我的答案。