使用 Perl 拆分浮点数
Using Perl to split a float
为什么我使用拆分会失去精度?
我的目标是只得到小数部分,全部。
$a = 123456789.123456789;
@b = split(/\./, $a);
$baseDec = "." . $b[1];
以上给出 $baseDec == .123457
但这给出了正确的精度:
这是正确的方法吗? 更正:这给出了同样糟糕的精度!
我没有正确测试代码。对不起!
$a = 123456789.123456789;
@b = split(/\./, $a);
$baseInt = $b[0];
$baseDec = $a - $baseInt;
我应该使用 Math::BigFloat 吗?
编辑: $a 应该是一个字符串 $a = "123456789.123456789";
然后原始代码就可以工作了。在我弄清楚如何让我的 Perl 与 longdouble 一起工作之前,我无法测试原始问题。答案似乎是我失去了精度,因为 $a 被存储在双精度(52 位 ~ 15 位十进制数字,如下 @Ben 所述)。 print $a
给出 123456789.123457
.
可以通过sprintf获取:
my $a = 123456789.123456789;
my @b = split(/\./, sprintf("%.8f",$a));
my $baseDec = "." . $b[1];
print $baseDec;
您可以使用 int
:
$a = 123456789.123456789;
$baseDec = $a - int($a);
你失去了精度,因为 123456789.123456789
是一个数字文字,默认情况下,Perl 编译器将其存储在 double
(52 位,~15 位十进制数字)$a
中。接下来,当 @b = split(/\./, $a);
运行时,$a
在它可以是 split
之前被隐式强制转换为字符串。
如果您的 Perl 被编译为使用 longdouble
s(参见:perl -V:uselongdouble
和 perl -V:doublesize
),数字文字将用 80 位(~21 位十进制数字)表示和字符串强制。
如果您要将其视为字符串,请一直这样做。您不会在没有引号的情况下分配字符串,对吧?
my $a = "123456789.123456789";
为什么我使用拆分会失去精度? 我的目标是只得到小数部分,全部。
$a = 123456789.123456789;
@b = split(/\./, $a);
$baseDec = "." . $b[1];
以上给出 $baseDec == .123457
但这给出了正确的精度: 这是正确的方法吗? 更正:这给出了同样糟糕的精度! 我没有正确测试代码。对不起!
$a = 123456789.123456789;
@b = split(/\./, $a);
$baseInt = $b[0];
$baseDec = $a - $baseInt;
我应该使用 Math::BigFloat 吗?
编辑: $a 应该是一个字符串 $a = "123456789.123456789";
然后原始代码就可以工作了。在我弄清楚如何让我的 Perl 与 longdouble 一起工作之前,我无法测试原始问题。答案似乎是我失去了精度,因为 $a 被存储在双精度(52 位 ~ 15 位十进制数字,如下 @Ben 所述)。 print $a
给出 123456789.123457
.
可以通过sprintf获取:
my $a = 123456789.123456789;
my @b = split(/\./, sprintf("%.8f",$a));
my $baseDec = "." . $b[1];
print $baseDec;
您可以使用 int
:
$a = 123456789.123456789;
$baseDec = $a - int($a);
你失去了精度,因为 123456789.123456789
是一个数字文字,默认情况下,Perl 编译器将其存储在 double
(52 位,~15 位十进制数字)$a
中。接下来,当 @b = split(/\./, $a);
运行时,$a
在它可以是 split
之前被隐式强制转换为字符串。
如果您的 Perl 被编译为使用 longdouble
s(参见:perl -V:uselongdouble
和 perl -V:doublesize
),数字文字将用 80 位(~21 位十进制数字)表示和字符串强制。
如果您要将其视为字符串,请一直这样做。您不会在没有引号的情况下分配字符串,对吧?
my $a = "123456789.123456789";