簡體   English   中英

PHP意外導致浮動到int類型轉換

[英]PHP unexpected result of float to int type cast

我想在php中將float轉換為int值:

var_dump((int)(39.3 * 100.0)); //Returns 3929 but should be 3930!
var_dump((int)(39.2 * 100.0)); //Returns 3920

我可以使用ceil來使它工作,但是有人可以向我解釋一下嗎?

var_dump((int)ceil(39.3 * 100.0)); //Returns 3930

這是因為在基數10中具有有限表示的數字可能或可能不具有PHP使用的浮點表示中的精確表示。

看到

>php -r "echo var_dump(sprintf('%.40F', 39.3 * 100.0));"
string(45) "3929.9999999999995452526491135358810424804688"

由於int總是將數字向下舍入,因此表示中的一個小錯誤會使得它會向下舍入一個你想要的數字。

考慮使用round代替。

這可能會遲到,但正確的方法如下:

(int) bcmul(39.3, 100.0); // 3930
(int) bcmul(39.2, 100.0); // 3920

對於處理浮點數的數字/計算,或涉及金錢交易的任何事情,你不應該直接使用乘法/除法+鑄造。

請參考以下內容:

http://php.net/manual/en/book.bc.php

注意:我的答案中的轉換只是將String轉換為Int,(你不需要這樣做)

// gives: int(3930)
var_dump(intval((39.3 * 100.0) . '')); 

或者,與功能一起使用:

function floatToInteger ($fValue)
{
    return (intval(($fValue + 0) . ''));
}

// gives: int(3930)
var_dump(floatToInteger(39.3 * 100.0));

你應該看看這個頁面: http//php.net/manual/en/language.types.float.php 它描述了使用浮點數的陷阱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM