PHP(int)生成错误的数字

时间:2017-10-17 18:57:11

标签: php casting integer

我正在处理一个处理monetairy数量的PHP脚本,因此需要精确到2位小数。为此,我将用户输入转换为数字乘以100,然后将其转换为int。这很好用,直到我最近发现一个在转换为int时增加1的数字。

故障代码:

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

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

2 个答案:

答案 0 :(得分:1)

当您将字符串乘以100时,您会获得float,并且其表示形式并不总是您所期望的,在本例中为250921.99999999997。见:

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

然后你施放到一个integer,它将分数归为250921。请参阅Is floating point math broken?

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

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

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

echo $number = (number_format(str_replace(',', '.', '2509,22'), 2, '.', '')*100);

答案 1 :(得分:0)

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

$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