鍍金池/ 問答/Java  PHP/ php float 轉(zhuǎn) int 的問題

php float 轉(zhuǎn) int 的問題

這樣一段代碼:

$red_money = 143.66;
$receive_money = 14.55;
$residue_money = $red_money > $receive_money ? $red_money - $receive_money : 0;
$receive_money = $residue_money * 100;
var_dump($receive_money);
var_dump((int)$receive_money);

打印出來是這樣的,怎么解釋這個問題
圖片描述

回答
編輯回答
擱淺

原因:浮點數(shù)的精度問題。

轉(zhuǎn)為整型

clipboard.png

注意:

  1. 向下取整,即:12910.9 會被轉(zhuǎn)換為 12910

    <?php
    var_dump(intval(12910.9));
    
    // 輸出
    // int(12910)
  2. 浮點數(shù)精度
    clipboard.png

    看如下執(zhí)行結果:
    clipboard.png
    我們知道:$receive_money 值小于 12911

總結:所以,最后 $receive_money 轉(zhuǎn)換為整型時,向下取整,結果為:12910

參考:


問題補充:

為什么 float(12911) 沒有顯示成 12910.9999... 呢?

這是由于浮點數(shù)的二進制表示形式?jīng)Q定的。
看如下示例:

clipboard.png

我們看到第 9 行代碼 float(12911) 擴展整數(shù)位之后,轉(zhuǎn)換成整型表示:int(129109999)。
然后,我們對比了 float(12911)int(12911) 在二進制上的差別。
是不是發(fā)現(xiàn)了什么?(二進制的最后一位)這是 PHP-bug 么?當然不是。
而且我們同樣也注意到了第 8 行代碼輸出結果為:float(129110000),這又是為什么呢?
為什么不是 float(129109999)呢?

我們看一下 PHP 源碼中浮點數(shù)是什么:
clipboard.png
如圖:php-float 等于 c-double
我想如下幾個問題可以解決上述的疑問:
雙精度浮點數(shù) 的二進制形式是如何表示的呢? 請參考:wikipedia-雙精度浮點數(shù)
浮點數(shù)是如何處理乘法運算的呢? 請參考:wikipedia-浮點數(shù)的乘法和除法

如果上邊兩個問題不愿深究,可以直接參考鳥哥的一篇博客:PHP浮點數(shù)的一個常見問題的解答

以上為個人理解,如果錯誤之處,請指出。

2018年3月19日 15:00
編輯回答
尐潴豬

四舍五入取證 round(param)
向上取整 ceil(param)
向下取整 floor(param)

2017年10月5日 07:28
編輯回答
悶騷型
(143.66 - 14.55) * 100 = 12910.999999999998
浮點數(shù)接近12911
12910.999999999998
這個數(shù)的整形不就是 12910么..

2018年4月16日 03:20