基于SpringBoot的四则运算API
一、关于产品
(一)使用
在使用时基于SpringBoot网址栏输入代码后输入如下url可实现四则运算:
- 加法
localhost:8080/add?a=%d&b=%d
- 减法
localhost:8080/sub?a=%d&b=%d
- 乘法
localhost:8080/mul?a=%d&b=%d
- 除法
localhost:8080/div?a=%d&b=%d
p:使用时%d为输入数据,整型与浮点型均可,运行代码见文末。
(二)问题及解决方案
问题一:java本身只支持整型运算,造成很大局限性。
解决方案:通过使用BigDecimal,使浮点型数据可以运算。
问题二:浮点型数据运算存在精度丢失问题。
解决方案:通过BigDecimal中的toString
方法,先将参数转为String类型,然后执行参数为String类型的BigDecimal的构造函数,可手动设置精度,及四舍五入等,从而减少精度丢失的情况。
问题三:常规整型与浮点型运算均存在数据溢出的情况。
解决方案:通过使用BigDecimal构造函数,方法同上,将参数转为String类型,后可解决int等类型的数据溢出问题。
二、关于学习
(一)学习过程(失败过程)
- 通过培训课,学会了基本的控制器(
@RestController
)映射方法(@GetMapping
,@RequestParam
),之后通过网络学习尝试了应用BigDecimal,但掌握比较浅显。 - 尝试学习通过thymeleaf建立简易前端,添加thymeleaf依赖及建立.html文件成功,源码中路径配置正常,.html文件运行正常,同时按照thymeleaf语法在后端控制器及templates下的.html文件中编写了程序,但后端程序运行时所有项目爆红,后经查询,可能是我的SpringBoot和thymeleaf的版本兼容问题(也可能是我的问题),所以在此不再展示,日后会继续研究,解决这个问题。
- 尝试学习将.html文件直接置于静态资源包中构建简易前端,在学习过程中理解了.html文件中代码及标签的含义,但是理解不到位,导致这个想法尚未实现,日后会继续学习。
(二)其他知识
在这几天的学习过程中,虽然有很多失败的尝试,但是同时也学到的一些方法,例如:
- 尝试在WebMvcAutoConfiguration中阅读源代码,对于其中部分内容有了初步的了解。
- 学会阅读英文文档,尝试阅读thymeleaf官网上的英文文档,虽然不能完全看懂,但是已经能初步接受阅读英文学习知识这种形式。
三、代码
package com.example.firstspringboot.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.math.RoundingMode;
@RestController
public class Main {
@GetMapping("/add")
public static double add(@RequestParam double a,@RequestParam double b){
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.add(b2).doubleValue();
}
@GetMapping("/sub")
public static double sub(@RequestParam double a,@RequestParam double b){
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.subtract(b2).doubleValue();
}
@GetMapping("/mul")
public static double mul(@RequestParam double a,@RequestParam double b){
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.multiply(b2).doubleValue();
}
@GetMapping("/div")
public static double div(@RequestParam double a, @RequestParam double b, int scale){
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.divide(b2, 2 , RoundingMode.HALF_UP).doubleValue();
}
}