Ram*_*ino 1 floating-point perl for-loop
我有一个for循环,我想每次增加0.1的变量,但是值的变化与增量不同,我不确定为什么.
我已经简化了for循环,它仍然提供了一个奇怪的输出:
for (my $t = 1000; $t < 1500 ;$t+=0.1) {
print "$t\n";
}
Run Code Online (Sandbox Code Playgroud)
它打印:
1034.9
1035
1035.1
1035.2
1035.3
1035.4
1035.49999999999
1035.59999999999
1035.69999999999
1035.79999999999
1035.89999999999
1035.99999999999
1036.09999999999
1036.19999999999
1036.29999999999
[it then goes on like this to 1500]
Run Code Online (Sandbox Code Playgroud)
我不知道小数位的来源.这是我对Perl的理解的问题吗?
提前致谢.
1/10是二进制的周期数,例如1/3是十进制的.它不能完全表示为浮点数.
$ perl -e'printf "%.20g\n", 0.1'
0.10000000000000001
Run Code Online (Sandbox Code Playgroud)
切勿在不涉及容差的情况下将浮动指针编号与另一个浮动指针编号进行比较,并警惕错误的累积.
这里的简单解决方案是使用整数进行算术运算,并在需要时生成浮点数
for (my $tx10 = 10000; $tx10 < 15000; ++$tx10) {
my $t = $tx10/10;
print "$t\n";
}
Run Code Online (Sandbox Code Playgroud)
这简化为
for my $tx10 (10000..14999) {
my $t = $tx10/10;
print "$t\n";
}
Run Code Online (Sandbox Code Playgroud)
____ ____ ____
0.1 = 0.00011 0.4 = 0.0110 0.7 = 0.10110
____ ____
0.2 = 0.0011 0.5 = 0.1 0.8 = 0.11001
____ ____ ____
0.3 = 0.01001 0.6 = 0.1001 0.9 = 0.11100
Run Code Online (Sandbox Code Playgroud)