PHP 将 float 转换为 int 返回不同的值

问题描述 投票:0回答:2

当我在 PHP (v5.5.9) 中执行以下代码时,发生了意外情况:

$valueAsCents = 54780 / 100 * 100;
var_dump($valueAsCents);
var_dump((int) $valueAsCents);

此返回

float 54780
int 54779

很明显,没有小数的 float 值不等于 int 值。对这里发生的事情有什么想法吗?

php casting
2个回答
5
投票

当你除以 $valueAsCents = 54780 / 100 时,它就变成了一个浮点数,由于它们的存储方式,它在数字形式上并不总是准确的。在我的测试中我得到了
547.7999999999999545252649113535881042480468750000

乘以 100 就是这样
54779.9999999999927240423858165740966796870000

当 PHP 转换为 int 时,它总是向下舍入。
从浮点转换为整数时,数字将向零舍入。

这就是为什么int值为54779

此外,Float 类型的 PHP 手册还包含一个提示,即浮点数可能不会达到您的预期。

此外,可以精确表示为以 10 为基数的浮点数的有理数(例如 0.1 或 0.7),不能精确表示为以 2 为基数的浮点数,无论尾数的大小如何,都在内部使用。因此,它们无法在不损失少量精度的情况下转换为内部二进制对应项。这可能会导致令人困惑的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期的 8,因为内部表示类似于 7.9999999999999991118....


0
投票

在这个网站(https://floating-point-gui.de/)有各种语言的浮点问题的解决方案,其中包括 PHP https://floating-point-gui.de/languages /php/

© www.soinside.com 2019 - 2024. All rights reserved.