2013-03-19 88 views
2

試圖將9769712680字節轉換爲千兆字節。我有以下代碼:字節到千兆字節轉換不起作用

$value = 9769712680/(1024 * 1024 * 1024); 

這應該給出9 Gb的值,但它會給出2047 Mb(或2 Gb)。

也試過:9769712680/1024/1024/1024但這也是同樣的事情。

任何想法?

+3

64位或32位系統上你? 32位系統上的最大整數大小爲2147483647,即大約2G。 – 2013-03-19 22:18:14

+0

重複http://stackoverflow.com/questions/211345/working-with-large-numbers-in-php? – MatRt 2013-03-19 22:20:43

+2

儘管這應該仍然有效,但PHP使用浮點數表示帶符號int範圍之外的數字。我剛剛嘗試過'echo 9769712680 /(1024 * 1024 * 1024);'在使用32位版本的Windows系統上,它會產生預期的'9.0987 ...'。你能顯示你從哪裏獲得數據?避免將任何內容投射到整數,因爲這會將值修剪回界限。 – DaveRandom 2013-03-19 22:27:36

回答

5

9769712680 - 你在這裏有整數溢出,所以它變成2^31,即max int值。

+0

im在64位系統上,數據來自XML文件,使用foreach加載該值,然後$ value = 9769712680 /(1024 * 1024 * 1024); – user2080473 2013-03-19 22:43:52

+0

@ user2080473什麼是確切類型的號碼?很明顯,你以某種方式得到最大的int32而不是你的號碼。 – Andrey 2013-03-19 22:46:55

+0

9769712680是斧標號 如果我做$ value = $ test; echo「$ test」我得到號碼9769712680 – user2080473 2013-03-19 22:57:42

0

看起來最初的數字表示爲int32。做一些數學(使用Matlab):

9769712680/(1024*1024*1024) = 9.09875396639109 

double(int32(9769712680))/(1024*1024*1024) = 2 
0

我不知道爲什麼這不是正確的代表(它對我有用)。
無論如何,您可以使用通常用PHP編譯的BC Math library來解決任意長度的數字的方程式。

在你的情況是這樣的:

$value = bcdiv('9769712680', '1073741824', 4); /// 1024^3=1073741824 
0

您可以使用BCMath library

$bytes = '976971268097697126809769712680976971268097697126809769712680'; 
$Gb = bcdiv($bytes, bcpow(1024, 3), 2); 
echo $Gb; // 909875396730096197509923682250992368225099236822509.92