双重问题

时间:2011-04-06 21:50:55

标签: java

我将一个数字存储为double。它适用于小数字但如果double是1000000并且我尝试向它添加10,它不起作用但我可以添加100。如果double是100000并且我尝试向其添加1,则它不起作用但我可以添加10。

这是使用double的问题吗?我最多使用9位数字的格式是什么格式?

编辑:我正在对数字进行计算并将其置于0.00十进制格式。它适用于小数字,但不适用于大数字。它可能与其他计算有关。只是看看问题可能是双重的。

当我拿1000001/100并输入0.00十进制格式时遇到问题。但1000100/100投入0.00分格式的工作。

7 个答案:

答案 0 :(得分:4)

不确定你的意思是“它不起作用”,考虑到它应该:

System.out.println(1000000d + 10d); // 1000010.0

无法使用的情况是,如果某个值超过所涉及的最大双数的最高位数的大约15位数:

System.out.println(Math.pow(10, 18) + 10d - Math.pow(10, 18)); // 0.0
System.out.println(Math.pow(10, 17) + 10d - Math.pow(10, 17)); // 16.0
System.out.println(Math.pow(10, 16) + 10d - Math.pow(10, 16)); // 10.0

答案 1 :(得分:2)

是的,这就是floating point一般的工作方式。 (尽管正如其他人所指出的那样,这应该在double的实际能力范围内。)随着数量越来越大,它会越来越精确。即使数量很少,也不能保证精确。对于小整数来说,这是一般规则,但在实践中,依赖浮点精度是一个坏主意。

对于整数,long应该足够好,2 63 -1是你可以存储的最大数字。

否则BigDecimal就是答案。不太方便,但确切。

根据您问题的更新,您希望存储价格或类似的东西。在这种情况下,您可以use a library dedicated to currency arithmetic(因为通常会涉及奇怪的舍入规则),或者在long中存储便士/美分。

答案 2 :(得分:2)

int绝对足以存储9位数字,因为(带符号)整数存储的最大值为2^31 - 1 = 2,147,483,647,有10位数。

如果您需要更大的范围,请使用long

Java Tutorial: Primitive Data Types

答案 3 :(得分:1)

双人实际上能够保持这个结果。最可能的事情可能是您正在检查/打印出数字,看起来数字没有差异(您可以发布测试代码吗?)。

作为一般的经验法则,双精度可以提供~16位精度,浮点数可以提供~8位精度。

答案 4 :(得分:1)

您需要保留哪种9位数字? double应该具有足够的精确度跟踪{有效数字{1}}的9位有效数字,但在选择类型之前,您需要知道所需的数字类型。如果您需要实际值(即,它们具有小数点右侧的数字),则选择double。如果它们是整数,请选择int

答案 5 :(得分:1)

我认为你的确切问题不是很清楚。你使用整数运算吗?在这种情况下,你应该期望一个整数除法来舍入答案。

int i = 1000001 / 100;
System.out.println(i);

double d = (double) 1000001 / 100;
System.out.println(d);

按预期打印

10000
10000.01

然而,既然你没有给出一个明确的例子,说明你的工作是什么以及你期望发生什么,我们只是猜测你的问题可能是什么。

答案 6 :(得分:0)

然而,有一些错误。应该可以(ab)使用double(在Java中为64位IEEE格式)作为48位左右的整数。 48 bt应该足以存储9个十进制数字。