使用BCMath获取两个实数的模数

时间:2017-10-10 14:44:44

标签: php bcmath

我想知道一个真实数字是否是另一个真实数字的众多数字。我正在使用BC-Math,因为代码是进行价格计算的较大系统的一部分,并且由于浮点数学的行为,使用浮点数会导致多次计算的错误结果。

BC-Math有bcmod()来获得任意精度数的模数。但是,在PHP 7.2之前,此函数不适用于非整数数字字符串。 E.g:

echo bcmod('10', '9.2'); // 1, because '9.2' is truncated to '9'

fmod function returning wrong result

以来,将数字转换回浮点并使用fmod()不是一个选项

我无法找到解决此问题的任何方法,但我无法想象没有解决方案。

修改

以后你好读者遇到同样的问题!基于@ chiliNUT的回复,我为pull-request库创建了bcmath-extended

1 个答案:

答案 0 :(得分:2)

我认为可以使用一些数学来完成:

您可以将mod(a,b)ab联系起来:

a = b * floor(a/b) + mod(a,b)

explanation

然后解决mod的等式得出

mod(a,b) = a - b * floor(a/b)

替换你的号码

mod(10,9.2) = 10 - 9.2 * floor(10/9.2) = 0.8

另见这里的bcmath楼层实施:How to ceil, floor and round bcmath numbers?