从 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条评论
登录后参与评论

相关文章

来自分类Dev

从int转换为float,可能舍入吗?

来自分类Dev

在Go中将float转换为int时如何舍入到最接近的int

来自分类Dev

错误:“ Int”不可转换为“ @lvalue Float”

来自分类Dev

错误:“ Int”不可转换为“ @lvalue Float”

来自分类Dev

从unsigned int转换为float时出错

来自分类Dev

错误转换为float,然后在python中转换为int

来自分类Dev

错误转换为float,然后在python中转换为int

来自分类Dev

从'float'转换为'int'?

来自分类Dev

错误:无法将“ float(*)(int)”转换为“ float”

来自分类Dev

将int转换为float会导致错误的值(尽管不是通常的十进制舍入错误)

来自分类Dev

将int转换为float会导致错误的值(尽管不是通常的十进制舍入错误)

来自分类Dev

Golang将float64转换为int错误

来自分类Dev

在PHP中将float转换为int时丢失数据

来自分类Dev

将long int转换为float时,numpy失去精度

来自分类Dev

将float转换为int时的Golang怪异行为

来自分类Dev

如何在必要时将Float转换为Int?

来自分类Dev

将Float转换为Int

来自分类Dev

将float转换为int

来自分类Dev

将float转换为varchar时避免上舍入

来自分类Dev

在C#中强制转换为“ int”时,“ const float”值与“ float”不同

来自分类Dev

在C#中强制转换为“ int”时,“ const float”值与“ float”不同

来自分类Dev

将pandas float系列转换为int

来自分类Dev

将int转换为float / double

来自分类Dev

将int位转换为float位

来自分类Dev

从int32矩阵转换为float

来自分类Dev

从Float转换为Int会更改输出

来自分类Dev

安全将Float转换为Int?

来自分类Dev

astype未将float转换为int

来自分类Dev

从int32矩阵转换为float

Related 相关文章

热门标签

归档