软件园学生在线

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

登录与注册

后端一 刘瑞琪

  • 刘瑞琪
  • 2023-10-29
  • 0

产品说明

  • 产品名称:劣质只支持两元计算的四则计算器
  • 产品使用:
    1. 首先你需要运行项目并打开网址(
    2. 本产品一共有三个参数:先算参数a,后算参数b,功能参数op(是operation的缩写,不是o)
    3. 你需要填写功能参数op来决定你想要的计算方式:
key 功能
add 加法
是 减法
是 乘法
是 除法

ps:请不要输出一些奇怪的东西

  • 特殊情况处理:
    1. 除法中的b参数不能为0,经判断后会给出提示
    2. 参数op输入其他字符串经判断后会给出提示
    3. 无限小数会以四舍五入的方式保留8位小数
    4. 可能(?)解决了数据溢出

      学习历程

      文档学习

      1.解决数据溢出:一开始查资料时,只查到强制类型转换或者利用算法来解决数据溢出,但要么效果不够要么要求太过高,然后就看见了群里有大佬提到BigDecimal.于是我就去查此的用法,然后重写我的计算器
      2.解决返回异常:一开始我设想的是当他错误时返回一段话来提醒用户输入错误,但我返回类型是BigDecimal接受类型.
      于是我想到将返回类型和接受形参全改成String类型,通过创建BigDecimal对象并使用自带构造器将String类型转化为BigDecimal类型;通过调用toPlainString()方法将BigDecimal类型转化为String类型返回.
      但这里又出了问题,那就是toPlainString()不能填进参数,于是我创建了临时BigDecimal型变量容纳调用四则运算方法后的结果,再调用toPlainString()方法.
      可是依然不能解决用户在a,b输入String类型的问题,于是查到了处理异常的try-catch-语句,经过学习后(还是没搞懂throw),我将能转化形参为BigDecimal的语句放在了try语句中,catch放入return语句.
      本以为作业这就结束了,试数的时候发现如1/3这样的无限循环小数会引起错误的http响应码,于是又去上网上查怎样解决,发现BigDecimal a4 = numberA.divide(numberB, 8, RoundingMode.HALF_UP);方法接收的第二个参数表示保留几位小数,而RoundingMode.HALF_UP表示采用四舍五入方式
      虽然查资料挺费神的,但我还想做个简单的前端,苦于没有一点基础,上次又没有偷师前端,于是去速通了HTML,发现基本语法确实简单,但是学完后写不出一点,又不知道怎样将我写的HTML传入的数据与Controller联系在一起,于是又去查资料去了...之后例如什么依赖导不进去等等就不赘述了

      拓展知识(以下只会简单拓展,具体放在我参考学习的网站中)

      1. BigDecimal
      BigDecimal 类支持任何精度的浮点数,可以用来解决数据溢出的问题,可以调用方法来实现基本的运算

      public BigDecimal abs() //返回对象的绝对值
      public BigDecimal pow(int n)  //返回对象的平方数
      public BigDecimal add(BigDecimal augend)   //返回对象与另一个对象的和
      public BigDecimal subtract(BigDecimal subtrahend) //返回对象与另一个对象的差
      public BigDecimal multiply(BigDecimal multiplicand) //返回对象与另一个对象的积
      public BigDecimal remainder(BigDecimal divisor) //返回对象与另一个对象的余数
      public int compareTo(BigDecimal val) //比较对象与另一个对象的大小
      public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode )    // 除法操作
      //注意:运用比较方法时,当number1小于number2时,返回-1,当number1等于number2时,返回0,当number1大于number2时,返回1。

      2. try-catch
      讲这个不得不需要学习java中异常处理,我也只是简单了解一下
      使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。

      try
      {
      // 程序代码
      }catch(ExceptionName e1)
      {
      //Catch 块
      }

      Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。
      如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。
      ps:我只是简单了解到可以处理异常,而catch中的异常类型不知道填什么,最后用idea自动生成的try-catch自动填上了Exception e,莫名其妙过了
      3. HTML
      只说一下输入框和提交按钮
      <code class="prettyprint" >type是属性,text是文本领域,namea与参数a相连(不知道对不对),placeholder表示显示的文字
      sumbit表示提交按钮,value是字

      引用网址

    5. BigDecimal
  • Java BigDecimal使用指南
  • Java BigDecimal 的舍入模式(RoundingMode)详解
  • Java大数字运算(BigInteger类和BigDecimal类)
    1. try-catch
  • Java 异常处理
  • java异常处理(较详细)
    1. Html
  • HTML
  • spring-boot-starter-thymeleaf没导入到springboot项目内导致无法访问静态页面

    代码

  • Controller:
    
    import com.example.houduanhomework.service.Service;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;

@RestController
public class Controller {
@Autowired
Service numa; //自动装配对象

@GetMapping("/calculate")
public String calculator(@RequestParam String a, @RequestParam String b, @RequestParam String op) {
    return numa.calculate(a, b, op);
}
@org.springframework.stereotype.Controller
public class ViewController {
    //负责渲染图像
    @GetMapping("/")
    public String simple() {
        return "simple";
    }
}

}

- Service:
```java
import lombok.Data;
import java.math.BigDecimal;
import java.math.RoundingMode;

@org.springframework.stereotype.Service
@Data
public class Service {
    //创建一名为"calculate"方法,负责进行四则运算
    public String calculate(String a, String b, String op) {
        //定义BigDecimal类型的变量
        BigDecimal numberA = null;
        BigDecimal numberB = null;

        //判断数据类型是否异常
        try {
            numberA = new BigDecimal(a);
            numberB = new BigDecimal(b);
        } catch (Exception e) {
            //若异常
            return "不准输入别的东西!";
        }

        //四则运算
        switch (op) {
         case ("add"): {
             //加法
             BigDecimal a1 = numberA.add(numberB);
             return a1.toPlainString();
         }
         case ("subtract"): {
             //减法
             BigDecimal a2 = numberA.subtract(numberB);
             return a2.toPlainString();
         }
         case ("multiply"): {
             //乘法
             BigDecimal a3 = numberA.multiply(numberB);
             return a3.toPlainString();
         }
         case ("divide"): {
             //除法
             if (numberB.compareTo(BigDecimal.ZERO) == 0) {
                 //防止参数b为0
                 return "分母不能为零捏";
             }
             BigDecimal a4 = numberA.divide(numberB, 8, RoundingMode.HALF_UP); //防止无限小数出现
             return a4.toPlainString();
         }
         default: //如果用户没有输入正确功能参数
             return "摸摸,没有这种功能,再试试吧";
     }
    }
  • HTML
    <!DOCTYPE html>
    <html>
    <head>
    <title>Calculator</title>
    </head>
    <body>
    <h1>这是一个计算器</h1>
    <p>请输入你想运算的两个数,并在功能区输入<br>add-加法<br>subtract-减法<br>multiply-乘法<br>divide-除法</p>
    <form action="/calculate" method="get">
    <input type="text" name="a" placeholder="First Number" required>
    <input type="text" name="b" placeholder="Second Number" required>
    <input type="text" name="op" placeholder="请输入您想要的功能" required>
    <input type="submit" value="启动">
    </form>
    </body>
    </html>
刘瑞琪
刘瑞琪
© 2025 软件园学生在线
Theme by Wing