Get all decimal places in a number after division

白昼怎懂夜的黑 提交于 2019-12-05 23:18:34

问题


I am currently using the BigDecimal and it is giving me more decimals but not nearly enough for what I am trying to do. I need to be able to get all the way to the 10^6 digit. This is my current code

BigDecimal num = new BigDecimal(103993/33102.0);
    pw.println(num.toString());

and it outputs 3.14159265301190249175533608649857342243194580078125

where the number actually has a lot more decimals: http://www.wolframalpha.com/input/?i=103993%2F33102


回答1:


You are loosing the precision when evaluating this:

103993/33102.0

as a double division. Actually, the following:

BigDecimal num = new BigDecimal(103993/33102.0);

is equivlent to:

double d = 103993/33102.0;
BigDecimal num = new BigDecimal(d);

instead, use:

int scale = 100;
BigDecimal num1 = new BigDecimal(103993);
BigDecimal num2 = new BigDecimal(33102);
System.out.println(num1.divide(num2, scale, RoundingMode.HALF_UP).toString());

OUTPUT:

3.1415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737



回答2:


The problem is how you are making your number. The 103993/33102.0 is evaluated as a double precision floating point expression (double) before the BigDecimal class ever gets involved. You should make separate BigDecimal objects and use BigDecimal.divide to get the number you want.

Since you want exact results, I'd probably pass both of your numbers in as integers when starting.

Even after doing that, I doubt you'll be able to get out to the 10^6 digit. You might need to implement your own division algorithm to get out to that level as any sane implementation of arbitrary precision math is going to stop long before that point (at least by default).



来源:https://stackoverflow.com/questions/15164636/get-all-decimal-places-in-a-number-after-division

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!