java - BigDecimal - 如何在 Java 中进行此计算

标签 java bigdecimal

我有..

目标=目标最大/难度

目标最大值 = 26959535291011309493156476344723991336010898738574164086137773096960

难度=14484.162361

目标 = 26959535291011309493156476344723991336010898738574164086137773096960/14484.162361

目标=1861311315012765306929610463010191006516769515973403833769533170

所以我在 Java 中尝试这样做

    double difficulty = 14484.162361;

    String targetmaxStr = "26959535291011309493156476344723991336010898738574164086137773096960";

    BigDecimal targetmaxd = new BigDecimal(targetmaxStr);

    BigDecimal difficultyd = new BigDecimal(difficulty);

    BigDecimal targetd = targetmaxd.divide(difficultyd, MathContext.DECIMAL128); 

    System.out.println("target : " + targetD);

打印

目标:1.861311315012765229690386592708552E+63

我真的很期待值(value):

目标=1861311315012765306929610463010191006516769515973403833769533170

最佳答案

您遇到了三个问题。

首先,使用 targetd.toPlainString()) 打印 BigDecimal 避免使用科学计数法。

其次,您使用 MathContext.DECIMAL128 过多地限制了精度。尝试使用类似 new MathContext(200) 的方法。

第三,正如评论中所讨论的那样,从 double 创建 BigDecimal 会产生一些精度问题。从 String 创建以避免这些问题。

这是所有内容:

String targetmaxStr = "26959535291011309493156476344723991336010898738574164086137773096960";
BigDecimal targetmaxd = new BigDecimal(targetmaxStr);
BigDecimal difficultyd = new BigDecimal("14484.162361");
BigDecimal targetd = targetmaxd.divide(difficultyd, new MathContext(200)); 
System.out.println("target : " + targetd.toPlainString());

结果:

目标:1861311315012765306929610463010191006516769515973403833769533170.51815116697448072744646582880154445957194141397542 70599065953124329244737606680298383048483144520034008751609022370030307892100271382756

关于java - BigDecimal - 如何在 Java 中进行此计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46185626/

相关文章:

java - 我无法找出代码中的 "Java InputMismatchException errors"

java - 写入 "println"修复了我的代码,怎么样?

c# - 如何处理大于 double 最大值的浮点值

ruby-on-rails - 在 BigDecimal 上定义检查的缺点

PHP 将大十进制数转换为十六进制

java - Glassfish [java.lang.reflect.InvocationTargetException]

java - 我如何知道 Soundpool 已准备好使用低于 2.2 的 SDK 目标?

java - 无法启动 Java 客户端 1.5.0 NoSuchMethodException

Java 精确计算 - 使用选项

java - 如何从 Java 8 中的对象列表中获取两个属性的乘积