gpt4 book ai didi

java - BigDecimal 精度高于 1E22

转载 作者:行者123 更新时间:2023-12-01 22:56:38 24 4
gpt4 key购买 nike

出于某种原因,我发现自己正在编写一些软件,它应该能够执行一些天文计算。虽然大部分内容都是关于将正确的公式转移到 Java 中,但我在“测试如何计算大数”的一开始就发现了一个恼人的问题。

好吧...想象一下太阳(我们的太阳),它的质量为(大约为圆形,为了更容易解释)10E30 kg。十个,后面有 30 个零。所有 native 数据类型都无法用于此目的。提一下:我知道我可以使用 3000 来计算,只需在输出 View 中添加尾随零,但我希望保持尽可能精确。因此,使用短号码将是我最后的手段。

正视问题。请看一下代码:

    BigDecimal combinedMass = new BigDecimal(1E22);
int massDistribution = 10;
Integer mD1 = massDistribution;
Integer mD2 = 100 - massDistribution;
BigDecimal starMass;
BigDecimal systemMass;

systemMass = combinedMass.divide(new BigDecimal("100")).multiply(new BigDecimal(mD1.toString()));
starMass = combinedMass.divide(new BigDecimal("100")).multiply(new BigDecimal(mD2.toString()));

System.out.println((systemMass).toEngineeringString());
System.out.println((starMass));

它将输出 1000000000000000000000 和 9000000000000000000000,这正是我所期望的。但看看联合收割机质量场。如果我将其提高到 1E23,输出将会改变

我得到 9999999999999999161139.20 和 89999999999999992450252.80...

所以我知道我可以使用 jut BigInteger,因为在这种情况下它更可靠,但为了精确起见,有时 BigWhatEver 可能会下降到 50.1258 之类的值另外,我希望得到 10.xE30 作为输出,这只有使用 bigDecimals 才能实现。

我想知道:在保持计算 float 的能力的同时,是否没有办法避免这种情况(对于我尝试的每个值,该错误都会出现在 1E23 以上)?我应该将此字段的小数点后分隔符值削减为两位数字吗?

还有更多值得思考的事情:

System.out.println(combinedMass.precision());

与上面的代码相关的是,对于这种情况,将提供 23,但对于大多数其他值,则为 En+1(那是我真正感到困惑的时候)

感谢您的建议。

最佳答案

您正在使用基本类型而没有意识到:

new BigDecimal(1E22);

这里,1E22 是一个原始 double ,使用它已经失去了精度。

你想要的是

new BigDecimal("10000000000000000000000");

new BigDecimal(10).pow(22);

关于java - BigDecimal 精度高于 1E22,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23933140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com