在PHP中,ceil()可以求出偶数除法


In PHP, can ceil() ever round up an even division?

我读了很多问题和评论,但没有看到提到这一点,由于其他人可能也有同样的问题,我将其发布在这里。

考虑到浮点误差,是否有可能从ceil($a / $b)得到比它应该高一点的结果,其中$a / $b的其余部分为0?

如果是这样的话,因为我使用的是大于0的正整数,也许我应该写my_ceil(),在这里我首先检查$a % $b,如果它不是0,在调用内置函数之前,将0.1添加到$a…

如果您似乎在问如何在决定ceil结果时使用浮点,包括其正确的非绝对误差,则以下内容应指导您:

1)http://www.php.net/manual/en/language.types.float.php

精确表示为浮点的有理数以10为基数的数字,如0.1或0.7,没有精确的表示为以2为基数的浮点数,使用内部,无论尾数大小。因此,它们不可能在没有小损失的情况下转换为内部二进制对应物精度。这可能导致混淆的结果:例如,地板((0.1+0.7)*10)通常将返回7而不是预期的8,因为内部表示将类似于7.999999999999999 1118….

因此,永远不要相信浮点数的结果是最后一位,也不要直接比较浮点数是否相等[我的重点]。如果更高精度是必要的,可以使用任意精度的数学函数和gmp函数。

读取

任意精度的数学函数:http://uk1.php.net/manual/en/ref.bc.php

gmp:http://uk1.php.net/manual/en/ref.gmp.php

2) 当ceil只会四舍五入到最近的整数时,使用ceil($float)时,您关心的是浮点值(作为单个输入值),因此无论浮点值是什么,都无关紧要。您可能正在考虑使用round()函数。它有自己的方法来处理上述浮点不准确性问题。

http://php.net/manual/en/function.round.php


为了回答的原始问题,考虑到浮点误差,是否有可能从ceil($a / $b)中得到比它应该高一点的结果,其中$a / $b的其余部分为0答案是肯定的,因为有两点:

  • Float在基数为10的数字中可能非常不准确,并且

  • 您使用了错误的函数来获得所需精度的输出。在这种使用多个浮点数的情况下,您需要一个内置精度要求的函数,如gmp或数学函数。

查看github上的ceil源代码,它似乎依赖于C库的ceil函数。

编辑:要回答这个问题——是的,它(可能)可以。

我想这实际上与ceil()无关,而是与所讨论的除法是否返回浮点或整型值有关。

根据http://php.net/manual/en/language.operators.arithmetic.php…

除法运算符("/")返回一个浮点值,除非两个操作数是整数(或转换为整数的字符串),并且数字是可整除的,在这种情况下,将返回一个整数值。

因此,至少使用一个浮点值可能会产生一个ceil()"错误",但我应该可以使用两个整数。