如何防止perl中的浮动数字变圆?

时间:2016-07-27 10:36:41

标签: perl

我从不同来源获取一些数字,其浮点数不同。我正在总结所有数字。这些数字会自动完成。有人请建议防止在perl中自动完成。

示例代码段位于下方。

#!/usr/bin/perl
use strict;
my $x=200.1564867256545456457;
my $y=3352.25654454545454;

print "X : $x\n Y : $y\n";

1 个答案:

答案 0 :(得分:11)

你不能改变有floating point个数字有限的事实,而实际数字却不计其数。

您始终可以选择无需修改即可将其作为字符串进行读取和打印。但是,当你执行任何算术时,你处于浮点土地。

您有两种选择:1。您可以使用printf/sprintf使用比默认值更多的数字打印数字;或2.您可以尝试使用任意精度算术。后者必然要慢得多,你需要注意如何初始化变量。

#!/usr/bin/env perl

use strict;
use warnings;

my %n = (
    x => 200.1564867256545456457,
    y => 3352.25654454545454,
);

printf "%s = %.18f\n", $_, $n{$_} for qw/x y/;

输出:

x = 200.156486725654531256
y = 3352.256544545454289619

这表明大多数实数不能用浮点数表示。

使用Math::BigFloat

#!/usr/bin/env perl

use strict;
use warnings;

use Math::BigFloat;
Math::BigFloat->accuracy(24);

my %n = (
    x => Math::BigFloat->new('200.1564867256545456457'),
    y => Math::BigFloat->new('3352.25654454545454'),
);

print "$_ = $n{$_}\n" for qw/x y/;

输出:

x = 200.156486725654545645700
y = 3352.25654454545454000000