如何修复此代码以便1.1 + 2.2 == 3.3?这里发生了什么导致这种行为?我模糊地熟悉舍入问题和浮点数学,但我认为这仅适用于除法和乘法,并且在输出中可见.
[me@unixbox1:~/perltests]> cat testmathsimple.pl
#!/usr/bin/perl
use strict;
use warnings;
check_math(1, 2, 3);
check_math(1.1, 2.2, 3.3);
sub check_math {
my $one = shift;
my $two = shift;
my $three = shift;
if ($one + $two == $three) {
print "$one + $two == $three\n";
} else {
print "$one + $two != $three\n";
}
}
[me@unixbox1:~/perltests]> perl testmathsimple.pl
1 + 2 == 3
1.1 + 2.2 != 3.3
Run Code Online (Sandbox Code Playgroud)
编辑:
到目前为止,大多数答案都是"它是一个浮点问题,duh",并为它提供了解决方法.我已经怀疑是问题所在.我该如何演示?如何让Perl输出长形式的变量?将$ one + $ 2计算存储在临时变量中并打印它并不能证明问题.
编辑:
使用aschepler演示的sprintf技术,我现在能够"看到"问题.此外,根据mscha和rafl的建议,使用bignum可以解决比较不相等的问题.但是,sprintf输出仍然表示数字不正确.这对这个解决方案留下了一点疑问.
bignum是解决这个问题的好方法吗?是否有任何可能的副作用,我们在将其整合到一个更大的,现有的程序时应该注意什么?