我们有一个 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
,并且当我将它转换为 int it's 时255
,如果我在同一个调用中将它转换为 int,为什么不一样?
我的意思是,我可以简单地做'2.55' * 100
,并且 php 转换会正确计算这个,但我仍然很好奇为什么会发生这种情况?
版本:
PHP 7.1.15-1+ubuntu16.04.1+deb.sury.org+2 (cli) (build: Mar 6 2018 11:10:13) ( NTS )
这可能是一个浮点错误。
在 php 中,像 255 这样的浮点值实际上可能类似于 254.9999991。您可以round
在转换为int
.
echo (int) ( round( (float) '2.55' * 100 ) );
这将导致
255
来自 PHP 文档:
警告 浮点精度 浮点数的精度有限。尽管这取决于系统,但 PHP 通常使用 IEEE 754 双精度格式,由于按 1.11e-16 的顺序四舍五入,这将给出最大的相对误差。非初等算术运算可能会产生较大的误差,当然,当多个运算复合时,必须考虑误差传播。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句