JAVA实现计算器功能

本文介绍了如何使用JAVA实现一个计算器功能,重点在于选择使用BigDecimal以避免精度损失。讲解了浮点型、双精度型和BigDecimal的特性,并给出了具体代码实现。文章提供了运行测试的建议,并提示如何根据需求调整数据类型,但未涉及反射获取值的详细代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 前言

  1. 最近有一个新的需求,使用固定公式,代入值,计算结果。例如(3*B-99)*5,其中B预期设想是使用反射获取。

二. 使用BigDecimal的原因。

  1. float : 浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位)
  2. double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效位)
  3. decimal:数字型,128bit,不存在精度损失,常用于银行帐目计算。(28个有效位)

三. 具体代码

package com.demo.am.util;

import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;

/**
 * @author l
 * Note
 * 1.未解析公式中出现的百分比,如 A*B% 需要转换写法,变为 A*B/100
 * 2.本工具只有简单的加减乘除,没有开发更复杂的函数操作
 */
public class Calculator {
   
    /**
     * 变量集合
     **/
    private static final List<String> varList = new LinkedList<>();

    /**
     * 变量和值的key-value
     **/
    private static final Map<String, BigDecimal> varListWithValue = new HashMap<>();

    public static void mockCalculate() {
   
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入要计算的公式: ");
        String formula = sc.next();
        String str = replaceBlankSpace(formula);
        // 赋值变量列表
        assignmentFinalVarList(str);
        // 赋值对应值
        varList.forEach(s -> {
   
            System.out.print("请输入" + s + "的值: ");
            BigDecimal decimal = sc.nextBigDecimal();
            varListWithValue.put(s, decimal);
        });
        // 代回公式进行替换
        String newFormula = replaceFormula(str);
        // 进行计算
        BigDecimal decimal = calculate(newFormula);
        System.out.println("计算结果:" + decimal);
    }

    /**
     * Calculate result.
     *
     * @param formula formula
     * @return decimal
     */
    public static BigDecimal calculate(String formula) {
   
        while (isExistBracket(formula)) {
   
            String resultFormula = null;

            // 找最内层的括号里面的内容出来(含括号)
            String calcString = findBracket(formula);

            if (StringUtils.isNotBlank(calcString)) {
   
                BigDecimal result = calculateCourse(calcString);
                // 替换括号的内容(含括号)
                resultFormula = formula.replace(calcString, String.valueOf(result));
            }

            if (StringUtils.isNotBlank(resultFormula)) {
   
                formula = resultFormula;
            }
        }
        // 最后得到普通顺序无括号公式:
        // 公式可能还会存在括号,如(A+B*C),其不能算作错误公式
        // 最后一次计算:
        return calculateCourse(formula).setScale(2, RoundingMode.HALF_UP);
    }

    private static String findBracket(String formula) {
   
        // 寻找最后一个左括号里面到第一个右括号里面的内容
        char[] formulaArray = formula.toCharArray();
        for (int i = 0; i < formulaArray.length; i++) {
   
            if (formulaArray[i] == ')') {
   
                int begin = 0;
                for (int j = i; j >= 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值