浮点型到整型转换的 PHP 意外结果

我试图在php中将浮点数转换为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

答案 1

这是因为在以 10 为基数的有限表示形式的数字在 PHP 使用的浮点表示中可能具有也可能不具有精确的表示形式。

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

由于始终向下舍入数字,因此表示中的一个小错误会使强制转换将其向下舍入一个数字,否则您会期望。int

请考虑改用圆形


答案 2

这可能很晚了,但正确的方法如下:

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

对于处理数字/浮点数的计算,或任何涉及货币交易的事情,你永远不应该使用直接乘法/除法+铸造。

请同时参考以下内容:

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

注意:我的答案中的转换只是将String转换为Int,(你不需要这样做)


推荐