gpt4 book ai didi

perl - 我的最后一个循环去哪儿了?

转载 作者:行者123 更新时间:2023-12-04 04:15:05 25 4
gpt4 key购买 nike

在更新一些遗留 Perl 代码的过程中,我遇到了一种情况,即 C 风格的 for循环提前终止。

问题

这种情况可以重现如下(我在 Linux 和 Windows 上的结果相同):

$ perl
for($i = 0.8; $i <= 2.5; $i+=0.1){
print $i, "\n";
}
__END__
0.8
0.9
1
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2
2.1
2.2
2.3
2.4

2.5 明显不存在;它应该已经通过 $i <= 2.5有条件的。


修复

意识到这可能是由于浮点表示,如 perldoc perlfaq4 中所述,我更新了条件:

$ perl
for($i = 0.8; sprintf( '%.1f', $i ) <= 2.5; $i += 0.1 ) {
print $i, "\n";
}
__END__
0.8
0.9
1
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2
2.1
2.2
2.3
2.4
2.5 <--- Gotcha !

服务已恢复(至少我是这么认为的)。


验证

我想证明最后的 $i确实大于 2.5,所以我将增量包装在 do 中循环:

$ perl
for($i = 0.8; $i <= 2.5; do { $i += 0.1; print $i, "\n"; } ) {}
__END__
0.9
1
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2
2.1
2.2
2.3
2.4
2.5 <--- Surprise!

测试结果似乎表明浮点表示不是这里的问题。

这是怎么回事?

最佳答案

您对大于 2.5 的值打印为 2.5 感到惊讶吗?不要惊讶,这是正常的 float 。普通打印不会显示所有数字。试试这个:

printf "%.66g\n", $i

代替您的 print 语句。在我的机器上打印的最终值是 2.5000000000000013。你的可能会很相似。

关于perl - 我的最后一个循环去哪儿了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11823114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com