如何让舍入效应造成的0.100000000000001再次变成0.1?

问题描述 投票:0回答:1

在进行“正确的数学计算”时,浮点效应会导致数字

0.1
变为
0.100000000000001
。 所以我想做一些“四舍五入”,但我不确定该怎么做:

当做类似

sprintf('%.3f', $val)
之类的事情时,将会有总是三个小数位,如
0.100
。 对于具体示例,我可以使用格式
%.1f
,但是
0.1
只是 one 示例(也可以是
0.125
)。

我想要的是“最多三个小数位”(对于我的情况来说被认为是“足够”的精度)。 仅使用 Perl 核心包时,是否有比

print int($x * 1000) / 1000
更好的解决方案?

  DB<1> $x=0.100000000000001

  DB<2> print int($x * 1000) / 1000
0.1
  DB<3>
perl precision number-formatting
1个回答
0
投票

print
不显示全部数字。参见:

my $x = 0.100000000000001
printf "%1.20f\n", int($x * 1000) / 1000;

输出:

0.10000000000000000555

阅读每个程序员都应该了解浮点运算

要使用任意精度,请使用 Math::BigFloat,它核心模块。

use Math::BigFloat;
my $x = 'Math::BigFloat'->new('0.100000000000001');
© www.soinside.com 2019 - 2024. All rights reserved.