$ n = 2; 10- $ n = 87

时间:2010-07-14 08:56:46

标签: php math operators phantom-reference

这就是我正在做的事情:

$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?

<小时/> 的更新
是的,我的错误,幻影7,
但现在有人可以告诉我原因:

echo $flybuys.' % '.$check.'<br />';
   $res = $flybuys % $check;
   echo 'res: '.$res;

输出: 6014359000000928%8 res:7

4 个答案:

答案 0 :(得分:2)

模数结果不准确是因为6014359000000928(~2 ^ 52)超出了int的范围,因此PHP将其解释为float。这意味着您有一个32位系统(PHP数据类型大小因架构而异)。如果您需要对大数字进行数学运算,则可以使用GMP之类的库。 E.g:

$flybuys = gmp_init("6014359000000928");
$res = gmp_mod($flybuys, 8);

确保将大号数字作为字符串传递给GM​​P。

答案 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才有效。