Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BigDecimal-如何在Java中进行此计算_Java_Bigdecimal - Fatal编程技术网

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

BigDecimal-如何在Java中进行此计算,java,bigdecimal,Java,Bigdecimal,我有 目标=目标最大/难度 targetmax=269595352191130949315647634472399136010898738574164086137773096960 难度=14484.162361 目标=26959535529101130949315647634472399136010898738574164086137773096960/14484.162361 目标=1861311315012765306929610463010119100651676951597383376

我有

目标=目标最大/难度

targetmax=269595352191130949315647634472399136010898738574164086137773096960

难度=14484.162361

目标=26959535529101130949315647634472399136010898738574164086137773096960/14484.162361

目标=18613113150127653069296104630101191006516769515973833769533170

因此,我尝试在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.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)
构造函数?啊,这很有效。。多谢各位