-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 はこれを float として解釈します。これは、32 ビット システムを使用していることを意味します (PHP のデータ型のサイズはアーキテクチャによって異なります)。大量の計算を行う必要がある場合は、GMPなどのライブラリを使用できます。例えば:

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

大きな数値を文字列として GMP に渡すようにしてください。

于 2010-07-14T08:58:25.130 に答える
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

文字列として認識されている場合は、使用して int にキャストしてみてください。

(int)$total[1];

正直なところ、文字列分割を行うときに、おそらく $total 配列を int にキャストできます。

(int)$total = ...;

数値を表す文字列は (float) にキャストすることも、使用している php のバージョンによっては (double) にキャストすることもできます。

于 2010-07-14T09:10:49.240 に答える
0

コメントでは十分なスペースがないため、これを回答として追加しました。

これがここで説明されているアルゴリズムの実装である場合、モジュロ チェック6014359000000928 % 8 == 0は必要ないと思います。

たとえば、最初の 15 桁が6014 3590 0000 062. つまりevens、15、24、39 oddstotalおよびcheck1 です。1 を法とする任意の数は 0 です。したがって、 または6014 3590 0000 0628として有効です。それは意味がありません。6014 3590 0000 06206014 3590 0000 0627

と等しいかどうか、最後の桁を確認する必要があると思いますcheck。その場合のみ6014 3590 0000 0621有効です。

于 2010-07-14T11:31:34.517 に答える