在代码运行或称中,会有一些小数的计算结果无法准确求出,出现精度丢失的问题
原因:
- 是计算机在计算过程中,将给定的数值先转化为二进制计算,然后再转化为十进制,转化的过程中一定会有精度的丢失
解决: - 在我目前的能力范围之内找到的解决方法是利用BigDecimal
bigdecimal创建的对象可以有四种类型,int、double、long、String(创建一个具有参数所指定以字符串表示的数值的对象),具体是哪一种,要依据看对象的类型,如,double型就填“"2.3"”,String型就填类型为String的数据,这个数据是前面定义好的
bigdecimal用于商业计算,即是对精度有一定要求的计算。在所创建的double类型中仍然会出现精度偏差的现象,String类型可以代替int、long型的计算并且避免了double型的弊端。String类型的精度是确定的。意思就是拿字符串进行计算
既然决定用bigdecimal创建的String类型进行计算,那么在输入流中的输入数据的类型就得是String型,不能再是double型,这个时候,2.3与4.6之和的结果就能算出来了
四则运算:
- BigDecimal所创建的是对象,所以我们不能使用传统的+、-、*、/ 等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。
加法:a.add(b) 减法:a.subtract(b) 乘法:a.multiply(b) 除法:a.divide(b)
BigDecimal(int); // 创建一个具有参数所指定整数值的对象
BigDecimal(double); // 创建一个具有参数所指定双精度值的对象
BigDecimal(long); // 创建一个具有参数所指定长整数值的对象
BigDecimal(String); // 创建一个具有参数所指定以字符串表示的数值的对象
计算器的实现(一些运算没有添加,代码仍存在一些不足)
package src.com.peng.method;
import java.math.BigDecimal;
import java.util.Scanner;
public class calculate {
public static void main(String[] args) {
System.out.println("只支持加减乘除运算");
Scanner scanner = new Scanner(System.in);//用于接收键盘数据
System.out.print("输入第一个数字:");
String num1 = scanner.next();
System.out.print("输入有效运算符(+-*/):");
String symbol = scanner.next();
System.out.print("输入第二个数字:");
String num2 = scanner.next();
//bigdecimal的引入,防止了计算过程中精度丢失的问题,使字符串相加减
BigDecimal i = new BigDecimal(num1);//将字符型转化为bigdecimal类型,并赋值给新的变量
BigDecimal j = new BigDecimal(num2);
double c = j.doubleValue();//将bigdecimal转化为double类型并赋值给c,此时,j的数据类型与值是不变的
BigDecimal results;
switch (symbol) {
case "+":
results = add(i, j);
System.out.println(i + symbol + j + "=" + results);
break;
case "-":
results = sub(i, j);
System.out.println(i + symbol + j + "=" + results);
break;
case "*":
results = mul(i, j);
System.out.println(i + symbol + j + "=" + results);
break;
case "/":
if (c == 0) {//通过c是否为零,判断分母是否为零
System.out.println("分母不得为0");
} else {
results = div(i, j);
System.out.println(i + symbol + j + "=" + results);
break;
}
default:
System.out.println("输入的运算符无效");
}
scanner.close();
}
public static BigDecimal add(BigDecimal i, BigDecimal j) {//返回值类型、参数类型
return i.add(j);//使用bigdecimal的方法,参数类型必须也是bigdecimal类型的
}
public static BigDecimal sub(BigDecimal i, BigDecimal j) {
return i.subtract(j);/*bigdecimal的运算不可以用+-/*,因为bigdecimal创建的是一个对象,
所以只能通过调用其自身函数(方法)的方式*/
}
public static BigDecimal mul(BigDecimal i, BigDecimal j) {
return i.multiply(j);
}
public static BigDecimal div(BigDecimal i, BigDecimal j) {
return i.divide(j);
}
}
标签:BigDecimal,遇到,记录,System,results,bigdecimal,计算器,out,String
From: https://www.cnblogs.com/hezhipeng/p/16704017.html