这就是我正在做的事情:
$total = (array_sum($odds))+$evens;
$total = str_split($total);
echo 'total[1]: '.$total[1].'<br />';
echo '10-$total[1]: ' . (10-($total[1]));
,输出为:
total[1]: 2
10-$total[1]: 87
我的猜测是它被视为字符串,但我该如何解决?
所以,我想知道的是什么 wh(10 - ($ total [1])); = 87?
<小时/> 的更新
echo $flybuys.' % '.$check.'<br />';
$res = $flybuys % $check;
echo 'res: '.$res;
输出: 6014359000000928%8 res:7
答案 0 :(得分:2)
模数结果不准确是因为6014359000000928(~2 ^ 52)超出了int的范围,因此PHP将其解释为float。这意味着您有一个32位系统(PHP数据类型大小因架构而异)。如果您需要对大数字进行数学运算,则可以使用GMP之类的库。 E.g:
$flybuys = gmp_init("6014359000000928");
$res = gmp_mod($flybuys, 8);
确保将大号数字作为字符串传递给GMP。
答案 1 :(得分:0)
如果它被识别为字符串,您可以尝试使用
将其强制转换为int(int)$total[1];
老实说,当你进行字符串拆分时,你可以将$ total数组转换成一个int:
(int)$total = ...;
表示数字的字符串也可以转换为(浮点数),具体取决于您拥有的php版本(双精度)。
答案 2 :(得分:0)
无法重现此问题:
$total = 2222; // some imaginary number as I don't know your $odds and $evens;
$total = str_split($total);
var_dump($total);
/*
*array(4) {
* [0]=>
* string(1) "2"
* [1]=>
* string(1) "2"
* [2]=>
* string(1) "2"
* [3]=>
* string(1) "2"
*}
*/
var_dump($total[1]);
/*
* string(1) "2"
*/
var_dump((10-($total[1])));
/*
* int(8)
*/
绝对是预期的行为......
答案 3 :(得分:0)
我添加了这个作为答案,因为在评论中空间不够:
如果这是所描述的算法here的实现,我真的认为模数检查6014359000000928 % 8 == 0
不应该存在。
例如,考虑前15位数字,例如:6014 3590 0000 062
。因为evens
为15,odds
为24,total
为39,check
为1.任何模数为1的数字为0.因此6014 3590 0000 0628
有效6014 3590 0000 0620
是或6014 3590 0000 0627
。这没有意义。
我认为你必须检查最后一位与check
相等的数字。在这种情况下,只有6014 3590 0000 0621
才有效。