为什么在 Perl 中转换为整数时数字会减一?

Why the number decrements by one when converting to integer in Perl?

为什么在 Perl 中转换为整数时数字减一?

23/20 * 100000000
=> 115000000

int(23/20 * 100000000)
=> 114999999

为什么?

首先求值的子表达式“23/20”将整个表达式提升为浮点数,因此

sprintf( "%30.15f", 23/20 * 100000000)

产量

114999999.999999985098839

而相当于

sprintf( "%30.15f", 23 * 100000000 / 20)

首先计算 "23 * 100000000",它可以被 20 整除,并得到

115000000.000000000000000

3/20 是二进制的周期数,就像 1/3 是十进制的周期数一样。具体来说,23/20 等于

     ____
1.0010011 × 2^0

将这个数字存储为浮点数需要无限的资源。由于资源有限,存储的数量稍微少一些。

1.001 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0 × 2^0

十进制:

$ perl -e'printf "%.100g\n", 23/20'
1.149999999999999911182158029987476766109466552734375

然后将其乘以 100000000,这会导致更多的精度损失。

$ perl -e'printf "%.100g\n", 23/20 * 100000000'
114999999.99999998509883880615234375

int 执行截断,print 执行一些舍入。通过截断,您得到 114999999。四舍五入后,您会得到 115000000.