BigDecimal-如何在Java中进行此计算
我有 目标=目标最大/难度 targetmax=269595352191130949315647634472399136010898738574164086137773096960 难度=14484.162361 目标=26959535529101130949315647634472399136010898738574164086137773096960/14484.162361 目标=18613113150127653069296104630101191006516769515973833769533170 因此,我尝试在Java中这样做BigDecimal-如何在Java中进行此计算,java,bigdecimal,Java,Bigdecimal,我有 目标=目标最大/难度 targetmax=269595352191130949315647634472399136010898738574164086137773096960 难度=14484.162361 目标=26959535529101130949315647634472399136010898738574164086137773096960/14484.162361 目标=1861311315012765306929610463010119100651676951597383376
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.8613150127652296903386592708552E+63
我真的很期待价值:
target=18613113150127653069296104630101191006516769515973833769533170您有三个问题 首先,使用
targetd.toPlainString())
打印出BigDecimal
其次,使用MathContext.DECIMAL128
限制了精度太多。尝试类似于newmathcontext(200)
的方法
第三,正如评论中所讨论的,从double
创建BigDecimal
会产生一些精度问题。而是从字符串创建,以避免这些
这里是全部:
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());
结果:
目标:18613113150127653069296104630101191006516769515973403833769533170.5181511669974480727446582880154445957194141397542705990659531243292447606680298383830484831520034008751902237003038921003827182756
首先,使用targetd.toPlainString())
打印出BigDecimal
其次,使用MathContext.DECIMAL128
限制了精度太多。尝试类似于newmathcontext(200)
的方法
第三,正如评论中所讨论的,从double
创建BigDecimal
会产生一些精度问题。而是从字符串创建,以避免这些
这里是全部:
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());
结果:
目标:18613113150127653069296104630101191006516769515973403833769533170.518151166997448072744658288015444595719414139754270599065953124329244760668029838383830484831520034008751902237003038921003827182756这不是那个问题的重复。@Matthewmpeak我真的相信是这样。这种差异是由于使用了BigDecimal(double)
构造函数造成的,这也是其他问题所要解决的。你是对的,这是一系列问题的组合。像我在回答中指出的问题一样,从替身中创造难度是不准确的。我会更新我的答案以确保完整性。这不是那个问题的重复。@Matthewmpeak我真的相信是的。这种差异是由于使用了BigDecimal(double)
构造函数造成的,这也是其他问题所要解决的。你是对的,这是一系列问题的组合。像我在回答中指出的问题一样,从替身中创造难度是不准确的。我会更新我的答案以确保完整性。谢谢Matthew,但不知何故,只有前15位数字与答案匹配,其余数字与答案不匹配。您是否与我的更新进行了比较:BigDecimal(double)
构造函数?啊,这很有效。。非常感谢Matthew,但不知何故,只有前15位数字与答案匹配,其余数字与答案不匹配。您是否与我的更新进行了比较:BigDecimal(double)
构造函数?啊,这很有效。。多谢各位