为什么在 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
.
为什么在 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
.