【发布时间】:2018-03-29 13:40:11
【问题描述】:
我正在编写一个处理货币金额的 PHP 脚本,因此需要精确到 2 位小数。为此,我通过将用户输入乘以 100 将其转换为数字,然后将其转换为 int。这很好用,直到我最近发现一个数字在转换为 int 时会增加 1。
故障代码:
$number = (int)(str_replace(',','.',$_POST["input"])*100);
出现问题的数字是 2509,22(我住在荷兰,所以我们使用逗号作为小数,因此在上面的代码行中使用了 str_replace)。 这个值创建了整数 $number 250921,这显然是 1 太低了。 我知道 int 有限制,但据我所知,这个数字完全在这些限制之内......
【问题讨论】:
-
为什么需要将其设为 int?这样做的目的是什么?这个 int 旁边会发生什么?
-
我用它来确保输入不包含超过 2 个小数。如前所述,它是财务信息,这是为了防止用户在财务系统中输入小于可能的分数。
-
改用 bcmath。除非您绝对确定输出并且根据您的代码判断,否则切勿对浮点数进行操作,我确定您不是。您可以在此处阅读有关浮点数精度的更多信息php.net/manual/en/language.types.float.php
-
如果您使用的是财务值,那么您需要了解浮点表示在计算机上的局限性,以及转换为 int、floor、round 和 ceil 之间的区别
-
感谢马克贝克!我想我不知道这首先创建了一个浮点数,以及它的确切含义。