[英]Rounding error when casting from float to int
我們有一個API,以EUR字符串形式返回價格,例如2.55
或0.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的順序,它將提供最大的相對誤差。 非基本算術運算可能會產生較大的錯誤,並且,當然,在合並多個運算時必須考慮錯誤傳播。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.