软件园学生在线

  • {{ item.name }}
  • 2023试用期

登录与注册

后端一 王志凯

  • wzk
  • 2023-10-29
  • 0

四则运算API

  • 产品说明

唔,不会写前端,只能委屈用户手写URL了

在浏览器(或者postman)中输入localhost:8080/ ?num1= &num2=

在第一个空格处写运算类型add,subtract,multiply,divide(话说用户不会英文怎么办)

第二三个空格写要运算的数,然后回车!!!就可以得到结果了

  • 特殊情况&学习历程

    1.数据溢出,参考群里大佬的建议,使用Bigdecimal,学习了一下此类的用法,一用发现精度真的高,而且计算整数可以计算很多位,完全不用担心溢出。

    2.除数为0,解决方案见代码

    3.用户输入数据类型是否有误。这里先展示关于加法的(第一版)

    @PostMapping("/add")
      public BigDecimal add(@RequestParam BigDecimal bd1, @RequestParam BigDecimal bd2)
      {
          return service.add(bd1,bd2);
      }

    这个数据类型很奇怪,不是基本数据类型,但在浏览器输入整数居然可以运算!!!

    有点疑惑,后面想如果传参是String类型,用户是不是也必须传String类型呢?

    改进如下(第二版)

    @PostMapping("/add")
      public String add(@RequestParam String num1, @RequestParam String num2)
      {
          BigDecimal bd1,bd2;
    
              bd1 = new BigDecimal(num1);
              bd2 = new BigDecimal(num2);
          return service.add(bd1,bd2).toString();
      }

    然后神奇的是,如果我写String类型(num1="1",num2="2"),不能运算,但写Int类型(num1=1,num2=2)反而能算????????????????(当然,字符什么的也不行)

    嘶-------之后查了很多资料,但找不到为啥,快到ddl了,彻底疯狂!!!

    于是本着能用就行的心态,沿用上述代码

    继续改进:得给用户反馈告诉他们输入错误(至少字符什么的不行)

    学了下捕捉异常,版本3如下

    @PostMapping("/add")
      public String add(@RequestParam String num1, @RequestParam String num2)
      {
          BigDecimal bd1,bd2;
    
          try {
              bd1 = new BigDecimal(num1);
              bd2 = new BigDecimal(num2);
          } catch (NumberFormatException e) {
    
              return "输入类型错误";
          }
    
          return service.add(bd1,bd2).toString();
      }

    测试了一下,输入的不是整数会返回这条语句,虽然有点疑惑,但是要求基本上满足了。

    完整代码如下
    controller

    
    package com.example.calculator.controller;
    import com.example.calculator.Service.MainService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import java.math.BigDecimal;
    @RestController
    public class Controller {
    @Autowired
    MainService service;
    @PostMapping("/add")
    public String add(@RequestParam String num1, @RequestParam String num2)
    {
        BigDecimal bd1,bd2;
    
        try {
            bd1 = new BigDecimal(num1);
            bd2 = new BigDecimal(num2);
        } catch (NumberFormatException e) {
    
            return "输入类型错误";
        }
    
        return service.add(bd1,bd2).toString();
    }
    @PostMapping("/subtract")
    public String subtract(@RequestParam String num1, @RequestParam String num2)
    {
        BigDecimal bd1,bd2;
    
        try {
            bd1 = new BigDecimal(num1);
            bd2 = new BigDecimal(num2);
        } catch (NumberFormatException e) {
    
            return "输入类型错误";
        }
    
        return service.subtract(bd1,bd2).toString();
    }
    @PostMapping("/multiply")
    public String multiply(@RequestParam String num1, @RequestParam String num2)
    {
        BigDecimal bd1,bd2;
    
        try {
            bd1 = new BigDecimal(num1);
            bd2 = new BigDecimal(num2);
        } catch (NumberFormatException e) {
    
            return "输入类型错误";
        }
    
        return service.multiply(bd1,bd2).toString();
    }
    @PostMapping("/divide")
    public String divide(@RequestParam String num1, @RequestParam String num2)
    {
        BigDecimal bd1,bd2;
    
        try {
            bd1 = new BigDecimal(num1);
            bd2 = new BigDecimal(num2);
        } catch (NumberFormatException e) {
    
            return "输入类型错误";
        }
    
        return service.divide(bd1,bd2).toString();
    }
    }

service


package com.example.calculator.Service;

import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.RoundingMode;

@Service
public class MainService {
    public BigDecimal add(BigDecimal bd1,BigDecimal bd2)
    {
        return bd1.add(bd2);
    }

    public BigDecimal subtract(BigDecimal bd1,BigDecimal bd2)
    {
        return bd1.subtract(bd2);
    }
    public BigDecimal multiply(BigDecimal bd1,BigDecimal bd2)
    {
        return bd1.multiply(bd2);
    }
    public String divide(BigDecimal bd1,BigDecimal bd2)
    {
        BigDecimal ZERO=new BigDecimal("0");
        if(bd2.compareTo(ZERO)==0)
        {
            return "被除数不能为0请重新输入";
        }
        else
        {
            return bd1.divide(bd2,100, RoundingMode.HALF_UP).toString();
        }
    }

}
wzk
wzk
© 2025 软件园学生在线
Theme by Wing