在java中,如果涉及到浮点类型的数字类型的计算,加减乘除,不能使用float或者double类型直接计算,会造成精度丢失,计算的结果跟正常情况下的结果显示有很大区别.需要使用一种数字处理类BigDecimal.
1.springmvc中前端传递浮点型(float/double)问题
@RequestMapping(value = "/getCommissionRat/{vendorCode}/{price}",method = RequestMethod.GET)
@ResponseBody
public Double getCommissionRat(@PathVariable String vendorCode,
@PathVariable double price){
System.out.print(price)
//如果前端传入的price为10.5,打印出来的结果为10.0,出现小数点后面数字丢失,严重影响结果.
//可以使用@RequestMapping(value = "/getCommissionRat/{vendorCode}/{price:.+}"
// 或者@RequestMapping(value = "/getCommissionRat/{vendorCode}/{price:.*}"
...
}
小结:
需要在在传递的浮点型参数后面加:.+或者:.*
2.浮点型的加减乘除计算精度丢失问题
@RequestMapping(value = "/getCommissionRat/{vendorCode}/{price:.+}",method = RequestMethod.GET)
@ResponseBody
public Double getCommissionRat(@PathVariable("vendorCode")String vendorCode,
@PathVariable("price")double price){
//将double类型的值注入到BigDecimal中
BigDecimal param = new BigDecimal(10.5);
BigDecimal price2 = new BigDecimal(Double.toString(price));
//param和price2做乘法运算,设置小数点后位数为4,四舍五入
BigDecimal res = price2.multiply(param).setScale(4,BigDecimal.ROUND_HALF_UP);
return res.doubleValue();
}
小结:
浮点类型(float/double)类型的计算,通过BigDecimal这个数字相关类来处理,setScale(precision)来设置精度.
特别需要注意的是:BigDecimal对象.setScale(precision)返回一个新的BigDecimal对象,原来对象的精度不变.这也就解释了为什么通过setScale()设置了精度后无效的情况.
故需要
double result = price2.multiply(param).setScale(4,BigDecimal.ROUND_HALF_UP).doubleValue()来获取结果值.