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

时间:2017-09-12 21:31:49

标签: java bigdecimal

我有..

目标= targetmax /难度

targetmax = 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

我真的期待价值:

目标= 1861311315012765306929610463010191006516769515973403833769533170

1 个答案:

答案 0 :(得分:2)

你有三个问题。

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

其次,使用MathContext.DECIMAL128限制了你的精确度。请尝试使用new MathContext(200)之类的内容。

第三,正如评论中所讨论的那样,从BigDecimal创建double会产生一些精确问题。从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.5181511669744807274464658288015444595719414139754270599065953124329244737606680298383048483144520034008751609022370030307892100271382756