簡體   English   中英

從float轉換為int時的舍入錯誤

[英]Rounding error when casting from float to int

我們有一個API,以EUR字符串形式返回價格,例如2.550.035 但是我們的數據庫將其保存為美分,所以我寫了一種非常簡單的方法,只需執行以下操作即可將其轉換為美分

$cents = (int) ((float) $value['value']['amount'] * 100)

所以對於這段代碼

echo (int) ((float) '2.55' * 100);

結果應該是255 ,對吧? 但是不知何故,它是254 您只需執行以下操作即可在CLI上進行測試

php -r "echo (int) ((float) '2.55' * 100);"

當我得到(float) '2.55' * 100)的結果時,它只是255 ,而當我將其255為int時,它的值是255 ,如果我在同一調用中將其強制轉換為int,為什么它不一樣呢?

我的意思是,我可以簡單地執行'2.55' * 100 ,而php cast可以正確計算出這個值,但是我仍然很好奇為什么會這樣?

版:

PHP 7.1.15-1 + ubuntu16.04.1 + deb.sury.org + 2(CLI)(內置:Mar 6 2018 11:10:13)(NTS)

可能是浮點錯誤。

在php中,像255這樣的float值實際上可能像254.9999991。 您可以在轉換為int之前round該值。

echo (int) ( round( (float) '2.55' * 100 ) );

這將導致

255

從PHP Doc:

警告浮點數精度浮點數精度有限。 盡管它取決於系統,但PHP通常使用IEEE 754雙精度格式,由於舍入為1.11e-16的順序,它將提供最大的相對誤差。 非基本算術運算可能會產生較大的錯誤,並且,當然,在合並多個運算時必須考慮錯誤傳播。

http://php.net/manual/en/language.types.float.php

暫無
暫無

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

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