使用 BCMath 获取两个实数的模
Getting the modulo of two real numbers with BCMath
我想知道一个实数是否是另一个实数的倍数。我正在使用 BC-Math,因为该代码是进行价格计算的更大系统的一部分,并且由于浮点数学的行为,使用浮点数会导致多次计算出现错误结果。
BC-Math bcmod()
可以得到任意精度数的模数。但是,在 PHP 7.2 之前,此函数不适用于非整数数字字符串。例如:
echo bcmod('10', '9.2'); // 1, because '9.2' is truncated to '9'
将数字转换回浮点数并使用 fmod()
不是一个选项,因为 fmod function returning wrong result
我找不到这个问题的任何解决方案,但我无法想象没有解决方案。
编辑:
你好reader以后有谁遇到同样的问题!根据@chiliNUT 的回复,我创建了一个 pull-request for the bcmath-extended 库。
我认为可以使用一些数学来完成:
您可以使用以下等式将 mod(a,b)
与 a
和 b
联系起来:
a = b * floor(a/b) + mod(a,b)
然后求解 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?
我想知道一个实数是否是另一个实数的倍数。我正在使用 BC-Math,因为该代码是进行价格计算的更大系统的一部分,并且由于浮点数学的行为,使用浮点数会导致多次计算出现错误结果。
BC-Math bcmod()
可以得到任意精度数的模数。但是,在 PHP 7.2 之前,此函数不适用于非整数数字字符串。例如:
echo bcmod('10', '9.2'); // 1, because '9.2' is truncated to '9'
将数字转换回浮点数并使用 fmod()
不是一个选项,因为 fmod function returning wrong result
我找不到这个问题的任何解决方案,但我无法想象没有解决方案。
编辑:
你好reader以后有谁遇到同样的问题!根据@chiliNUT 的回复,我创建了一个 pull-request for the bcmath-extended 库。
我认为可以使用一些数学来完成:
您可以使用以下等式将 mod(a,b)
与 a
和 b
联系起来:
a = b * floor(a/b) + mod(a,b)
然后求解 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?