為什么在 Perl 中轉換為整數時數字減一?
23/20 * 100000000
=> 115000000
int(23/20 * 100000000)
=> 114999999
為什么?
uj5u.com熱心網友回復:
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.
uj5u.com熱心網友回復:
首先計算的子運算式“23/20”將整個運算式提升為浮點數,因此
sprintf( "0.15f", 23/20 * 100000000)
產量
114999999.999999985098839
而等價的
sprintf( "0.15f", 23 * 100000000 / 20)
首先計算“23 * 100000000”,它可以被 20 整除,并產生
115000000.000000000000000
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/470781.html
標籤:perl
上一篇:如何檢查客戶端是否已斷開連接?
