我一直致力于使用Nilakantha系列,BigDecimal和其他人的代码来计算pi的小程序 - 但是我编辑了。
到目前为止,这是代码:
package com.waitdev.pi;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigDecimal;
public class MainProgram {
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter the number of calculations you would like to do");
long no = Long.parseLong(reader.readLine());
long step = 0;
BigDecimal ans = new BigDecimal(3);
Double j = 2.0;
BigDecimal pi = new BigDecimal(0.0);
while (true) {
step++;
if ((step % 2) == 1) {
ans.add(new BigDecimal(4.0 / (1.0 * j * (j + 1) * (j + 2))));
} else {
ans.subtract(new BigDecimal(4.0 / (1.0 * j * (j + 1) * (j + 2))));
}
j += 2;
pi = ans;
if (step >= no)
break;
}
System.out.println("Calculated: " + pi);
BigDecimal enew = pi;
double error = enew.divide(3.1415926535897932);
if (error >= 1) {
double bigerror = 2 - error;
System.out.println("Your accuracy is: " + bigerror * 100 + "%");
System.out.println(step);
} else {
System.out.print("Your accuracy is: ");
System.out.print(error * 100);
System.out.println("%");
System.out.println(step);
}
}
}
当我运行此程序时,结果就是崩溃报告:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method divide(BigDecimal) in the type BigDecimal is not applicable for the arguments (double)
at com.waitdev.pi.MainProgram.main(MainProgram.java:38)
似乎是在这一部分:
double error = enew.divide(3.1415926535897932);
在eclipse中,这一行表示' BigDecimal类型中的方法除(BigDecimal)不适用于参数(double)'
顺便说一句,我是BigDecimal的新手,而且我也是Java的新手,而我确实知道一些基础知识。
答案 0 :(得分:1)
如果查看documentation for BigDecimal
,您会发现divide
函数有多个重载,但它们都没有double
作为参数。这就是编译器抱怨的内容
为了能够使用双,你必须使用像
这样的东西 BigDecimal enew = pi;
BigDecimal pizza = BigDecimal.valueOf(3.1415926535897932);
double error = enew.divide(pizza, 64, BigDecimal.ROUND_HALF_UP)
.doubleValue();
但请注意,您在BigDecimal
的使用方式没有多大意义。
使用BigDecimal
初始化double
并不是很精确,而且越多,BigDecimal
过时使用BigDecimal
就越多。所有计算都在BigDecimal
中完成,所有BigDecimal
都使用字符串或整数或常量或计算进行初始化,或者您也可以完全省略double
并使用double
绝对地。
再次,摆脱BigDecimal
,一直使用MathContext
。还要定义一个double
,其精度(不要太低!)和您喜欢的舍入模式,并在任何地方使用。
如果这是太多的工作,或者结果太慢,那么就会失去精确度并使用BigDecimal
代替Rectangles
。但不要按照你的方式混合它们。
答案 1 :(得分:0)
我认为你需要像这样使用 BigDecimal.ROUND_HALF_UP ......
BigDecimal c = a.divide(b,2, BigDecimal.ROUND_HALF_UP);