0

问题: Double 减去另一个 double 会返回不准确的结果。

通常的解决方案:使用大小数进行计算。

我不能使用它,因为它处于游戏循环的中间,只能在使用new创建时使用值设置大十进制,在游戏循环中我的内存不足。

什么解决方案?

这是代码:

public void UpdateStatsBar(double WorldPopulation, double WorldDead)
{
    Number = mOriginalPopulation - WorldPopulation;
}

我使用的数字达到数十亿,深度达到数十位(统计数据的平均值)例如:1432,323,234.234215232425322342

4

1 回答 1

2

假设你不能有十进制数的人活着或死去,我会使用long.

您能否提供一个示例说明您使用的未产生准确结果的数字?

BTW:如果你使用小于九千万亿的整数,甚至double会产生准确的结果。

BTW2:如果你new BigDecimal疯狂地创造但不保留它们,你会损害性能,但你不会耗尽内存。如果您的内存不足,则不是因为使用 BigDecimal。我建议您使用内存分析器来查找问题的真正原因。

一个例子

BigDecimal bd = BigDecimal.ZERO;
long l = 0;
double d = 0;
while (true) {
    for (int i = 0; i < 100000000; i++) {
        bd = bd.add(BigDecimal.ONE);
        l++;
        d++;
    }
    System.out.println("counting bd: " + bd + " l: " + l + " d:" + d);
}

使用 BigDecimal、long 和 double 打印数字计数。double 的格式不同,但值相同。

counting bd: 100000000 l: 100000000 d:1.0E8
counting bd: 200000000 l: 200000000 d:2.0E8
counting bd: 300000000 l: 300000000 d:3.0E8
... deleted ...
counting bd: 1900000000 l: 1900000000 d:1.9E9
counting bd: 2000000000 l: 2000000000 d:2.0E9
counting bd: 2100000000 l: 2100000000 d:2.1E9
counting bd: 2200000000 l: 2200000000 d:2.2E9
... deleted ...

即使-mx2m将堆限制为 2 MB,它也不会耗尽内存。

于 2012-09-19T19:02:41.480 回答