传递参数后精度下降

时间:2019-02-07 15:05:36

标签: java double precision long-integer

我的长线具有很大的价值。然后,我尝试将其作为参数传递给函数,该函数花了两倍的时间,此后精度就会损失。为什么会这样,我该如何避免呢?

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

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

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

我知道不是所有的多头都可以表示为双精度,但是如何保持原始值呢?

2 个答案:

答案 0 :(得分:1)

双精度数是浮点值。这意味着它永远不会拥有确切的值。任何浮点都有一定的精度,收费或错误。

换句话说,浮点数始终只是近似值。 近似值可以达到与任何近似值相同的值,但仍然保持近似值。

这会产生重要的后果:您不能仅以科学家的公式喂养双打食品。这样做通常会导致无法使用的不可靠/错误的结果。相反,您必须找到考虑到它是近似值的替代公式。例如,分裂和根稳定,不同大小值的差异会导致错误并需要缩放...

请记住,您获得了3038528443022022066688的近似值3.0385284430220667E18-这是有效的近似值。

当您告诉Java从您的long(这是一个“离散”数)创建双精度(纯数字:aproximation)时,发生了这种情况,微积分需要考虑这一点:离散数学或像Knuth称其为“ concrete”) 。

答案 1 :(得分:0)

不可能完全以double的形式保留提及的值。

3038528443022066688的二进制精度为62位。但是,double的尾数只有(AFAIR)53位。因此丢失了9位。如果您使用double,这是无法避免的。

如果您负担得起,则可以选择long,否则,可以使用BigIntegerBigDecimal,以最适合您的需求。