2017-02-10 140 views
0

我在php中使用bcmod和gmp_mod函数来处理大量数据。PHP bcmod或gmp_mod输入类型问题

这工作得很好:

// large number must be string 
$n = "10000000000000000000001"; 
$y = 1025; 
$c = 1025; 
// Both works the same (also tested in python) 
$y = gmp_mod((bcpowmod($y, 2, $n) + $c) , $n); 
$y = bcmod ((bcpowmod($y, 2, $n) + $c) , $n); 

但输入$n也不是一成不变的。所以我必须用型铸造喜欢:

$n = (string)10000000000000000000001; 

不起作用了。

GMP给出了这样的错误:

gmp_mod(): Unable to convert variable to GMP - string is not an integer 

而关于BC,使我这个错误:

bcmod(): Division by zero 

的问题是,(string)不将其转换为字符串罚款。任何想法?

编辑:我找到了解决办法here,但仍是输入字符串:

$bigint = gmp_init("9999999999999999999"); 
$bigint_string = gmp_strval($bigint); 
var_dump($bigint_string); 

回答

1

如果你正在服用的输入$n它会给你一个string不是int,如果你有类型铸造为int在任何点......照顾最大尺寸的int,上面给出的号码将被转换为1.0E+22现在会发生什么当您尝试键入转换(string)1.0E+22它变成"1.0E+22"这显然只是一个字符串,无法转换去gmp数。

,所以你需要科学记数法转换为字符串,将自动包括,因此你还需要更换那些逗号

$n = 10000000000000000000001; 
$n = str_replace(",", "", number_format($n)); 
+0

我知道原因,只是寻找一个解决方案。 –

+0

从来没有定义$ n的类型,它将始终是一个字符串...如果从...输入...你不能输入类型 –

+0

查看解决方案 –