在我的代碼中,我有以下行。乘法後的雙值負-Java
double temp=(c12*fileSize);
- 這裏C12是雙人和fileSizeis雙
- C12有一個值1700和
- 檔案大小有一個值1944038
而是相乘後我收到-990102696
。
任何人都可以幫助我嗎?是否有一些尺寸限制出了問題?
在我的代碼中,我有以下行。乘法後的雙值負-Java
double temp=(c12*fileSize);
而是相乘後我收到-990102696
。
任何人都可以幫助我嗎?是否有一些尺寸限制出了問題?
你的C12和檔案大小是最有可能的整數(+1托馬斯)。 Java將int整數溢出,變成負數,然後將該負值存儲在double中。投C12和檔案大小來相乘之前增加一倍:
double c12 = 1700, fileSize = 1944038;
System.out.println(c12 * fileSize);
生產:
3.3048646E9
感謝alpian多數民衆贊成工程我正在處理的一個varibales作爲整數,這是問題 – user750932 2011-05-12 16:39:45
嗨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
(int)1700 * (int)1944038
等於你-990102696
。
確定c12
和fileSize
不是整數?如果是,則乘法運算出現在整數類型中,整數溢出並且之後被提升爲double
。
使用BigDecimal multiply方法,而不是像這樣,以防止潛在過低問題同時處理大量雙號:
BigDecimal temp = (new BigDecimal(fileSize)).multiply(new BigDecimal(c12));
如果'fileSize'和'c12'確實是'double',則不會發生溢出。所以他們必須是'int'。所以不需要'BigDecimal'。將它們轉換爲「long」並進行正常的乘法運算。 – QuantumMechanic 2011-05-12 16:32:53
BigDecimal是很好的計算資金。人們經常濫用那些不瞭解浮點運算的人。 – Olaf 2011-05-12 16:33:25
做一個雙對飛:
double temp=(c12*1.0*fileSize);
否則,一個C12爲INT將再乘以int,結果溢出,後來 - 太晚 - 轉換爲double。
c12 = 1700.0
// or
filesize = 1944038f
會有所幫助,但文件大小爲float/double看起來很腥。
double c12 = 1700;
double fileSize = 1944038;
double temp=(c12*fileSize);
System.out.println(temp);
給人3.3048646E9
我敢打賭,你的C12和檔案大小是整數。
嗯,我只是去嘗試,我得到「3.3048646E9」。你不應該得到任何溢出環繞雙:如果你超過最大值,它應該變成「無限」。
我懷疑問題是無論你正在試圖做寫這個數。或者,也許你需要向我們展示更多的代碼。
一個文件(以字節爲單位)的大小始終是一個整體式的,沒有局部字節...'long'通常用於它。而'c12',不管它是什麼,在這個例子中可以是'int'或'long','temp'也需要'long'。 – ColinD 2011-05-12 16:29:31
順便說一句,你爲什麼試圖將文件大小存儲在一個雙?你是否期望你的文件中可以有一小部分字節?嗯,如果文件A只有3位,文件B只有5位,那麼我應該可以將兩個文件存儲在硬盤上的一個字節中! – Jay 2011-05-12 16:41:11