产品说明
- 产品名称:
劣质只支持两元计算的四则计算器 - 产品使用:
- 首先你需要运行项目并打开网址(
- 本产品一共有三个参数:先算参数a,后算参数b,功能参数op(是operation的缩写,
不是o) - 你需要填写功能参数op来决定你想要的计算方式:
key | 功能 |
---|---|
add |
加法 |
是 |
减法 |
是 |
乘法 |
是 |
除法 |
ps:请不要输出一些奇怪的东西
- 特殊情况处理:
- 除法中的b参数不能为0,经判断后会给出提示
- 参数op输入其他字符串经判断后会给出提示
- 无限小数会以四舍五入的方式保留8位小数
- 可能(?)解决了数据溢出
学习历程
文档学习
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
是文本领域,name
a与参数a相连(不知道对不对),placeholder
表示显示的文字
sumbit
表示提交按钮,value是字引用网址
- BigDecimal
- Java BigDecimal使用指南
- Java BigDecimal 的舍入模式(RoundingMode)详解
- Java大数字运算(BigInteger类和BigDecimal类)
- try-catch
- Java 异常处理
- java异常处理(较详细)
- 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>