我有很长的保存大的价值。然后,我尝试将其作为参数传递给函数,即采用双之后的精度丢失。这是为什么,我该如何避免这种情况?
long bigValue = 3038528443022066688L;
foo(bigValue);
...
foo(double value){
System.out.printlin(value);
}
实际结果:3.0385284430220667E18预计:原始值
我知道不是每个长可表示为一个双,但我怎么能保持原有的价值?
双是浮点值。这意味着它永远不会拥有一个确切的价值。任何浮点有一定的精度,tollerance或错误。
换句话说浮点始终只是一个aproximation。该aproximation能打出像任何近似可以精确值,但仍然保持了aproximation。
这一点具有重要的后果:你不能只给双打科学家的配方食品中。试图所以一般会导致无法使用不可靠/错误的结果。相反,你必须找到一个替代公式,考虑到它是一个aproximation。 E.g师和根stabelize,不同大小的值的差异导致的错误和需要缩放...
考虑到这一点你有3.0385284430220667E18为3038528443022066688的近似值 - 这是一个有效aproximation。
发生这种情况时,你告诉Java创建一个双:从长(普通的aproximation)(这是一个“独立”号和微积分需要采取到帐户:离散数学或像克努特将其称为“混凝土”)。
这是不能够保留mentionned值作为其全精度的double
。
3038528443022066688
具有62个比特的二进制精度。甲double
,然而,仅具有(AFAIR)53个比特的尾数。因此,9位都将丢失。如果你有double
工作,这是无法避免的。
如果你能负担得起这一点,你可以留在long
,否则,你可以使用BigInteger
或BigDecimal
,任何适合您的需求最好的。