使用此行,我希望输出201
$ perl -e '$e = '2.01'; $c = sprintf("%d", $e * 100); print $c;'
但我得到了200
。我不明白为什么。
答案 0 :(得分:3)
由于浮点数的二进制表示。
尝试:
perl -e '$e = 2.01;printf("%2.25f\n",$e);'
<强>输出:强>
2.0099999999999997868371793
此数字的整数部分乘以100得出200
答案 1 :(得分:2)
perl -e 'my $e = "2.01"; my $c = sprintf("%.0f", $e * 100); print $c;'
使用%d
时,整数将被截断。
如果你不打扰printf
:
perl -e 'my $e = "2.01"; my $c = $e * 100; print $c;'
答案 2 :(得分:1)
浮点表示对其准确性有限制,2.01
的二进制表示恰好比<2.0>
%d
格式转换将值截断为下一个最低值。它实际上调用int
,其文档说明
你不应该使用这个函数进行舍入:一个因为它截断为0,两个因为浮点数的机器表示有时会产生违反直觉的结果。
int(200.99999999999)
是200,这就是你得到的。
Perl中用于获得最接近浮点值的整数的规范方法是使用零小数点为零的%f
转换。所以,如果你写了
perl -e '$e = '2.01'; $c = sprintf("%.0f", $e * 100); print $c;'
您将获得输出
200
答案 3 :(得分:0)
以下文档提到浮点和二进制表示。这是来自python.org,但它也适用于perl。
https://docs.python.org/3/tutorial/floatingpoint.html
$ perl -e 'if (2.01 + 2.01 + 2.01 == 6.03) { print "yes" } else { print "no" }'
no
您可以尝试将bignum
pragma用作临时搭建:
$ perl -Mbignum -e '$e = "2.01"; $c = sprintf("%d", $e * 100); print $c;'
201