2011-05-12 65 views
8

在我的代碼中,我有以下行。乘法後的雙值負-Java

double temp=(c12*fileSize); 
  • 這裏C12是雙人和fileSizeis雙
  • C12有一個值1700和
  • 檔案大小有一個值1944038

而是相乘後我收到-990102696

任何人都可以幫助我嗎?是否有一些尺寸限制出了問題?

+1

一個文件(以字節爲單位)的大小始終是一個整體式的,沒有局部字節...'long'通常用於它。而'c12',不管它是什麼,在這個例子中可以是'int'或'long','temp'也需要'long'。 – ColinD 2011-05-12 16:29:31

+1

順便說一句,你爲什麼試圖將文件大小存儲在一個雙?你是否期望你的文件中可以有一小部分字節?嗯,如果文件A只有3位,文件B只有5位,那麼我應該可以將兩個文件存儲在硬盤上的一個字節中! – Jay 2011-05-12 16:41:11

回答

4

你的C12和檔案大小是最有可能的整數(+1托馬斯)。 Java將int整數溢出,變成負數,然後將該負值存儲在double中。投C12和檔案大小來相乘之前增加一倍:

double c12 = 1700, fileSize = 1944038; 
System.out.println(c12 * fileSize); 

生產:

3.3048646E9 
+0

感謝alpian多數民衆贊成工程我正在處理的一個varibales作爲整數,這是問題 – user750932 2011-05-12 16:39:45

+0

嗨alpian,雙d = 0.0; \t \t double e = -1 * 0.0; \t \t \t \t System.out.println(d * -2); \t \t System.out.println(e);這給了我-0.0的結果。你可以解釋嗎。你可以考慮double e = -1.0 * 0.0;也給出了-0.0 – 2016-11-30 14:57:48

9

(int)1700 * (int)1944038等於你-990102696

確定c12fileSize不是整數?如果是,則乘法運算出現在整數類型中,整數溢出並且之後被提升爲double

-1

使用BigDecimal multiply方法,而不是像這樣,以防止潛在過低問題同時處理大量雙號:

BigDecimal temp = (new BigDecimal(fileSize)).multiply(new BigDecimal(c12)); 
+3

如果'fileSize'和'c12'確實是'double',則不會發生溢出。所以他們必須是'int'。所以不需要'BigDecimal'。將它們轉換爲「long」並進行正常的乘法運算。 – QuantumMechanic 2011-05-12 16:32:53

+3

BigDecimal是很好的計算資金。人們經常濫用那些不瞭解浮點運算的人。 – Olaf 2011-05-12 16:33:25

0

做一個雙對飛:

double temp=(c12*1.0*fileSize); 

否則,一個C12爲INT將再乘以int,結果溢出,後來 - 太晚 - 轉換爲double。

c12 = 1700.0 
// or 
filesize = 1944038f 

會有所幫助,但文件大小爲float/double看起來很腥。

0
double c12 = 1700; 
    double fileSize = 1944038; 
    double temp=(c12*fileSize); 
    System.out.println(temp); 

給人3.3048646E9

我敢打賭,你的C12和檔案大小是整數。

1

嗯,我只是去嘗試,我得到「3.3048646E9」。你不應該得到任何溢出環繞雙:如果你超過最大值,它應該變成「無限」。

我懷疑問題是無論你正在試圖做寫這個數。或者,也許你需要向我們展示更多的代碼。