$n = 2; 10-$n = 87
Ну это то, что я делаю:
$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-($ всего [1])); = 87?
Обновить:
да моя ошибка, призрак 7,
но может ли кто-нибудь сейчас сказать мне, почему:
echo $flybuys.' % '.$check.'<br />';
$res = $flybuys % $check;
echo 'res: '.$res;
выходы: 6014359000000928 % 8 res: 7
4 ответа
Неточный результат модуля равен тому, что 6014359000000928 (~2^52) находится за пределами int, поэтому PHP интерпретирует его как число с плавающей точкой. Это означает, что у вас 32-битная система (размеры типов данных PHP варьируются в зависимости от архитектуры). Если вам нужно сделать математику для больших чисел, вы можете использовать такую библиотеку, как GMP. Например:
$flybuys = gmp_init("6014359000000928");
$res = gmp_mod($flybuys, 8);
Убедитесь, что вы передаете большие числа в GMP в виде строк.
Я добавил это как ответ, потому что в комментарии недостаточно места:
Если это реализация алгоритма, описанного здесь, я действительно думаю, что проверка по модулю 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
будет действительным.
Не удалось воспроизвести эту проблему:
$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)
*/
Абсолютно ожидаемое поведение...
Если он распознается как строка, вы можете попробовать привести его к int, используя
(int)$total[1];
Если честно, вы, вероятно, могли бы преобразовать массив $total в целое число int при выполнении разбиения строки:
(int)$total = ...;
Строки, которые представляют числа, также могут быть преобразованы в (float), и в зависимости от того, какая у вас версия php (double).