在 PHP 中处理大量数据
按照使用 模幂 .wikipedia.org/wiki/Fermat_primality_test" rel="noreferrer">费马素性测试 对于大数(100,000+),它需要一些非常大的计算。
当我将两个大数相乘(例如:62574 和 62574)时,PHP 似乎将结果转换为浮点数。 获取其模值会返回奇怪的值。
$x = 62574 * 62574;
var_dump($x); // float(3915505476) ... correct
var_dump($x % 104659); // int(-72945) ... wtf.
有什么方法可以让PHP正确执行这些计算吗? 或者,是否有另一种方法来查找适用于大数的模值?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
由于某种原因,PHP 中有两个标准库处理任意长度/精度数字: BC 数学 和GMP。 我个人更喜欢GMP,因为它更新鲜,API更丰富。
基于 GMP,我实现了 Decimal2 class 来存储和处理货币金额(例如 100.25 美元) )。 大量的 mod 计算没有任何问题。 使用非常大的数字进行测试。
For some reason, there are two standard libraries in PHP handling the arbitrary length/precision numbers: BC Math and GMP. I personally prefer GMP, as it's fresher and has richer API.
Based on GMP I've implemented Decimal2 class for storing and processing currency amounts (like USD 100.25). A lot of mod calculations there w/o any problems. Tested with very large numbers.
用这个
use this
您看过
bcmod()
吗? php 在 32 位平台上存在超过 2^31 - 1 的整数问题。have you taken a look at
bcmod()
? php has issues with integers over 2^31 - 1 on 32 bit platforms.我建议您尝试 BigInteger。 如果这不起作用,您可以使用 SWIG 添加用于大整数计算的 C/C++ 代码并将其链接到您的代码中。
I suggest you try BigInteger. If that doesn't work out, you may use SWIG to add C/C++ code for the big integer calculations and link it into your code.
我为您编写了一个非常小的代码,它肯定可以在大数字的情况下工作 -
您只需使用字符串来存储大数字并使用 PHP 中的 GMP 函数对其进行操作。
您可以在官方 PHP 手册中查看一些好的 GMP 函数 -
http://php.net/manual/en/ref.gmp.php
I wrote a very small code for you that will surely work in case of big numbers-
You simply have to use strings for storing big numbers and to operate on them use GMP functions in PHP.
You may check some good GMP functions in the official PHP manual here-
http://php.net/manual/en/ref.gmp.php
我找到了另一个解决方案,但数字将存储为字符串。 一旦将其转换回数字,您将受到底层平台精度的限制。 在 32 位平台上,可以表示为 int 类型的最大 int 是 2,147,483,647:
I found another solution, but the number will be stored as a string. As soon as you cast it back to a numeric, you'll be restricted to the precision of the underlying platform. On a 32 bit platform, the largest int you can represent as an int type is 2,147,483,647: