[英]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.