-1

好吧,这就是我正在做的事情:

$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

我的猜测是它被视为字符串,但我该如何解决?

所以,我想知道的是
(10-($total[1])); = 87?


更新:
是的,我的错误,幻影 7,
但现在谁能告诉我原因:

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

输出:6014359000000928 % 8 资源:7

4

4 回答 4

1

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

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

确保将大量数字作为字符串传递给 GMP。

于 2010-07-14T08:58:25.130 回答
0

如果它被识别为字符串,您可以尝试将其转换为 int 使用

(int)$total[1];

老实说,当您进行字符串拆分时,您可能会将 $total 数组转换为 int:

(int)$total = ...;

表示数字的字符串也可以转换为 (float),具体取决于您拥有的 php 版本 (double)。

于 2010-07-14T09:10:49.240 回答
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)
 */

绝对是预期的行为......

于 2010-07-14T09:12:33.547 回答
0

我将此添加为答案,因为评论中没有足够的空间:

如果这是此处描述的算法的实现,我真的认为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 06206014 3590 0000 0627。那没有意义。

我认为您必须检查最后一位是否与check. 只有在这种情况下才6014 3590 0000 0621有效。

于 2010-07-14T11:31:34.517 回答