2011-05-12 62 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”。你不应该得到任何溢出环绕双:如果你超过最大值,它应该变成“无限”。

我怀疑问题是无论你正在试图做写这个数。或者,也许你需要向我们展示更多的代码。