Perl sprintf整数问题

时间:2014-12-09 14:44:47

标签: perl

使用此行,我希望输出201

$ perl -e '$e = '2.01'; $c = sprintf("%d", $e * 100); print $c;'

但我得到了200。我不明白为什么。

4 个答案:

答案 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