我将一个数字存储为double
。它适用于小数字但如果double
是1000000并且我尝试向它添加10,它不起作用但我可以添加100。如果double
是100000并且我尝试向其添加1,则它不起作用但我可以添加10。
这是使用double
的问题吗?我最多使用9位数字的格式是什么格式?
编辑:我正在对数字进行计算并将其置于0.00十进制格式。它适用于小数字,但不适用于大数字。它可能与其他计算有关。只是看看问题可能是双重的。
当我拿1000001/100并输入0.00十进制格式时遇到问题。但1000100/100投入0.00分格式的工作。
答案 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
。
答案 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个十进制数字。