首页 > 其他分享 >学习记录9计算器以及遇到的问题

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

时间:2022-09-25 12:02:11浏览次数:43  
标签:BigDecimal 遇到 记录 System results bigdecimal 计算器 out String

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

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

相关文章

  • 学习记录8方法的重载、可变参数、递归
    方法的重载重载就是在一个类中,又想同的函数名称,但形参不同的函数即,一个类中有两个同名的方法,但这两个类的“返回值类型”、“形参类型”、“形参个数”不同,而在程序中......
  • 学习记录12异常机制
    什么是异常软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们叫异常,英文是:Exception,意思是例外。这些,例外情况,或者叫异常,怎么让我们写的程序做出合理的处理。......
  • 学习记录11面向对象
    什么是面向对象面向过程(具体)&面向对象(抽象)面向过程思想(线性思维)步骤清晰简单,第一步怎么做,第二部怎么做面向过程处理一些较为简单的问题面对对象思想(分类思维)物......
  • WPF开发中遇到的新知识 -- 9
    加载页面目的:在打开某个视图的时候,可能需要获取数据,而获取数据的时间一般会慢一点,所以应该提供一些反馈给用户,表示这个视图正在加载,而不是已经加载完成没有数据,重点是需要......
  • WPF开发中遇到的新知识 -- 5
    ContextMenu的使用目的:在使用扩展器装数据的时候,希望有删除、修改数据的功能,没有使用DataGrid是因为数据有层级,而且比较多,方法:如果在数据项后面简单地放个Button又不太......
  • WPF开发中遇到的新知识 -- 4
    使用ListBox作为导航栏,实现视图跳转在顶部导航栏的布局设计中,需要一个容器装着一系列视图的标签,如果这个标签是用Button来实现的,需要更改Button的控件模板,会稍微有点麻烦,......
  • WPF开发中遇到的新知识 -- 7
    搜索框目的:希望一个类似百度搜索框的功能,在输入框中输入内容,弹出下拉框,下拉框的内容随着输入的变化而变化方法:输入框,用户在输入的时候,变化的是Text属性,我们可以先绑......
  • WPF开发中遇到的新知识 -- 6
    DataGrid的简单使用因为我只需要一个简单的表格展示数据,而操作数据我是放在了Button中,所以我需要关闭DataGrid本身自带的一些操作数据的功能,以下都是需要关闭的RowHe......
  • WPF开发中遇到的新知识 -- 8
    Prism对话框移除最大化最小化和关闭目的:在弹出的对话框中,不需要最大化,最小化以及关闭按钮,自定义两个按钮,用作确认提交和取消提交方法:在Prism中找到的方法,直接在UserCont......
  • WPF开发中遇到的新知识 -- 1
    前后台同时启动的方式目的:希望在WPF前台启动后,带动ASP.NETCore后台服务一同启动,在前台关闭后,也一起关闭方法:在打开窗口之前,首先手动打开ASP.NETCore子进程,然后注册......