2010-07-14 43 views
-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 

我的猜測是,它被視爲一個字符串,但我怎麼修理它?

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


更新:
呀我的錯,一個幽靈7,
但誰能告訴我現在爲什麼:

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

輸出: 6014359000000928%8個 RES:7

+10

也許你在腳本的其他地方迴應僞造的__7__ – 2010-07-14 09:07:25

+1

$賠率和$ evens的內容是什麼? – knittl 2010-07-14 09:08:14

+2

'10 - '2''在PHP中爲8。另外,你期望輸出是什麼,var_export($ odds); var_export($ evens);'show?無論'$ total'是什麼,我認爲甚至不可能讓結果('10- $ total [1]')超出範圍[1,10]。 – 2010-07-14 09:08:20

回答

2

不準確的模數結果是因爲6014359000000928(〜2^52)超出了int的界限,所以PHP將其解釋爲浮點數噸。這意味着你有一個32位系統(PHP數據類型的大小因架構而異)。如果你需要在大數目上進行數學運算,你可以使用像GMP這樣的庫。例如:

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

請確保您將大量數字傳遞給GM​​P作爲字符串。

0

如果獲得確認爲一個字符串,你可以嘗試鑄造爲int使用

(int)$total[1]; 

說實話,你很可能投了$總數組轉換成一個int權當你做字符串分割:

(int)$total = ...; 

字符串表示數字也可鑄造成(浮動),取決於你有(雙),它的PHP版本。

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) 
*/ 

絕對預期的行爲...

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纔有效。