PHP (int) 生成错误的数字



我正在研究一个处理货币金额的 PHP 脚本,因此需要精确地使用 2 位小数。为此,我将用户输入转换为数字,方法是将其乘以 100,然后将其转换为 int。这工作正常,直到我最近发现一个数字在转换为 int 时会增加 1。

故障代码:

$number = (int)(str_replace(',','.',$_POST["input"])*100);

给出问题的数字是 2509,22(我住在荷兰,所以我们使用逗号作为小数,因此str_replace上面的代码行)。此值创建整数$number 250921,这显然是 1 太低了。我知道 int 有限制,但据我所知,这个数字完全在这些限制之内......

当你将字符串乘以100你会得到一个float,它的表示并不总是你期望的,在本例中250921.99999999997 . 查看:

echo serialize(str_replace(',','.','2509,22')*100);

然后你投射到一个integer,该截断分数以获得250921。请参阅浮点数学是否损坏?。

解决方案是删除逗号并按原样使用,并可选择转换为integer

$number = (int)str_replace(',', '', '2509,22');

对于用户输入太多小数的问题,您应该使用两个输入,一个用于整数,一个用于分数和/或限制/验证输入的格式是否正确。 但是,您可以先设置数字格式:

echo $number = (number_format(str_replace(',', '.', '2509,22'), 2, '.', '')*100);
<</div> div class="one_answers">

您可以使用正则表达式来匹配 int 和 0 - 两个小数点。
这不会进行任何转换,也不会增加或强制转换任何内容。
它将被视为一个字符串,除了小数位数之外没有任何变化。

$input = "2509,2222222";
// Regex number comma number (zero - two)
Preg_match("/(d+),*(d{0,2})/", $input, $m);
Unset($m[0]); // remove full match
Echo implode("", $m); // implode parts

https://3v4l.org/MjcYV

最新更新