[数字类型]java中涉及数字的计算

    在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()来获取结果值.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值