四则运算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(); }
测试了一下,输入的不是整数会返回这条语句,虽然有点疑惑,但是要求基本上满足了。
完整代码如下
controllerpackage 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();
}
}
}