我们有一个API,以欧元的字符串形式返回价格,例如2.55
或0.035
。然而,我们的数据库以美分保存,所以我写了一个非常简单的方法,通过执行
$cents = (int) ((float) $value['value']['amount'] * 100)
所以对于这段代码
echo (int) ((float) '2.55' * 100);
结果应为255
,对吗?但不知何故,它是254
。您只需执行
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)
答案 0 :(得分:1)
可能是浮点错误。
在php中,像255这样的浮点值实际上可能是254.9999991。在转换为round
之前,您可以int
值。
echo (int) ( round( (float) '2.55' * 100 ) );
这将导致
255
来自PHP Doc:
警告浮点精度浮点数有限 精确。虽然它取决于系统,但PHP通常使用 IEEE 754双精度格式,它将给出最大相对值 由于1.11e-16的舍入而导致的错误。非小学 算术运算可能会产生更大的错误,当然还有错误 当几个操作复合时,必须考虑传播。