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

模范男孩

我们有一个 API,它以 EUR 的字符串形式返回价格,例如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,并且当我将它转换为 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 的顺序四舍五入,这将给出最大的相对误差。非初等算术运算可能会产生较大的误差,当然,当多个运算复合时,必须考虑误差传播。

http://php.net/manual/en/language.types.float.php

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章