学习记录9计算器以及遇到的问题

在代码运行或称中,会有一些小数的计算结果无法准确求出,出现精度丢失的问题
原因:

  • 是计算机在计算过程中,将给定的数值先转化为二进制计算,然后再转化为十进制,转化的过程中一定会有精度的丢失
    解决:
  • 在我目前的能力范围之内找到的解决方法是利用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);
    }
}

posted @ 2022-09-25 11:50  BattleTrumpet  阅读(88)  评论(0)    收藏  举报