为什么使用split后我失去了精度?
我的目标是获得小数部分,全部的小数部分。
$a = 123456789.123456789;
@b = split(/\./, $a);
$baseDec = "." . $b[1];
以上给出 $baseDec == .123457
但是以下方法可以得到正确的精度:
$baseDec = round($baseDec, 10);
这样做是正确的吗?更正:这个方法会导致相同的错误精度!我没有正确测试代码,抱歉!
$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
。
printf("%.9f", $baseDec);
时,结果是0.123456791
而不是0.123456789
。 - Peter Mortensen