从float转换为int时的舍入错误

时间:2018-03-07 07:19:17

标签: php rounding php-7

我们有一个API,以欧元的字符串形式返回价格,例如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时,为什么不是{\ n}如果我在同一个调用中将它转换为int,它也一样吗?

我的意思是,我可以简单地执行'2.55' * 100并且php转换会正确地计算出来,但我仍然很好奇为什么会发生这种情况?

版本:

  

PHP 7.1.15-1 + ubuntu16.04.1 + deb.sury.org + 2(cli)(建于:2018年3月6日11:10:13)(NTS)

1 个答案:

答案 0 :(得分:1)

可能是浮点错误。

在php中,像255这样的浮点值实际上可能是254.9999991。在转换为round之前,您可以int值。

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