精度损失传递参数后,

问题描述 投票:0回答:2

我有很长的保存大的价值。然后,我尝试将其作为参数传递给函数,即采用双之后的精度丢失。这是为什么,我该如何避免这种情况?

long bigValue = 3038528443022066688L;
foo(bigValue);
 ...

foo(double value){
 System.out.printlin(value);
}

实际结果:3.0385284430220667E18预计:原始值

我知道不是每个长可表示为一个双,但我怎么能保持原有的价值?

java double precision long-integer
2个回答
1
投票

双是浮点值。这意味着它永远不会拥有一个确切的价值。任何浮点有一定的精度,toll​​erance或错误。

换句话说浮点始终只是一个aproximation。该aproximation能打出像任何近似可以精确值,但仍然保持了aproximation。

这一点具有重要的后果:你不能只给双打科学家的配方食品中。试图所以一般会导致无法使用不可靠/错误的结果。相反,你必须找到一个替代公式,考虑到它是一个aproximation。 E.g师和根stabelize,不同大小的值的差异导致的错误和需要缩放...

考虑到这一点你有3.0385284430220667E18为3038528443022066688的近似值 - 这是一个有效aproximation。

发生这种情况时,你告诉Java创建一个双:从长(普通的aproximation)(这是一个“独立”号和微积分需要采取到帐户:离散数学或像克努特将其称为“混凝土”)。


0
投票

这是不能够保留mentionned值作为其全精度的double

3038528443022066688具有62个比特的二进制精度。甲double,然而,仅具有(AFAIR)53个比特的尾数。因此,9位都将丢失。如果你有double工作,这是无法避免的。

如果你能负担得起这一点,你可以留在long,否则,你可以使用BigIntegerBigDecimal,任何适合您的需求最好的。

© www.soinside.com 2019 - 2024. All rights reserved.