在Perl中,为什么100*18.35不等于1835?

Tom*_*Tom -2 floating-point perl floating-point-comparison

当我运行以下Perl单线程时:

$ perl -e 'print "Oh no!\n" unless 1835 == 100*18.35'
Run Code Online (Sandbox Code Playgroud)

我明白了

Oh no!

这是为什么?

Sob*_*que 7

你缺少的是一个旧的计算机科学问题 - 浮点转换.

你看,你不能精确地将'0.35'表示为浮点数,因为它是二进制的周期数.

所以,如果你添加:

my $new = $a->{a} - $b;
print $new;
Run Code Online (Sandbox Code Playgroud)

你会得到:

2.27373675443232e-013
Run Code Online (Sandbox Code Playgroud)

$a->{a} 非常多$b,因此测试正确的.

如果你有以下情况,你可以看到这个:

my $new_val = 18.35 - 18;
print $new_val;
Run Code Online (Sandbox Code Playgroud)

虽然我们在这里 - 不要使用$a$b- 他们是保留的sort.无论如何,单字母var名称都不是好的风格.

也是my $a = {};多余的 - 没有必要像这样初始化一个空的哈希引用.

要做你想做的事,那么你需要比较'like types'或显式转换为整数:

$a->{a} = int(18.35 * 100);
Run Code Online (Sandbox Code Playgroud)

  • 使用`int`总是向下舍入,这并不总是正确的.你需要四舍五入到最近的. (3认同)