近期经常接触支付相关的功能,在开发及测试过程中,开始金额都使用的是double类型,而近期新进的需求存在支付时打折的情况,也就是会出现如 1.23元的情况,那么这时候问题来了,如果是直接使用1.23进行支付都是不存在问题的。而偏偏在支付前通常需要一些计算。我们的系统支持会员余额与三方支付(微信、支付宝)同时进行,比如一笔待支付的订单是12.8员,其中用户有5块钱的会员余额,剩下的7.8元通过三方支付进行(这里使用微信吧),那么就涉及到double减法,同时微信支付时需要将元转为分,就是7.8x100,这又涉及到了乘法,此时就出现了double精度计算的问题。如下例子:

double a = 12.3d;
double b = 5d;
System.out.println(a-b); // 7.300000000000001 double c= 1.13d;
System.out.println(c * 100); // 112.99999999999999

上面的计算存在了精度问题,这样计算还需要进行四舍五入,比较麻烦。因此我们想到使用BigDecimal来实现小数的计算。最简单的加减乘除运算如下,希望可以帮到遇到同样问题的童鞋:

package com.blacksonny.utils;

import java.math.BigDecimal;

/**
* Created by kk on 2015/12/28.<br>
*/
public class NumericUtils { /**
* double 加运算
*
* @param a
* @param b
* @return
*/
public static double add(double a, double b) {
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.add(b2).doubleValue();
} /**
* float 加运算
*
* @param a
* @param b
* @return
*/
public static float add(float a, float b) {
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.add(b2).floatValue();
} /**
* double 减运算
*
* @param a
* @param b
* @return
*/
public static double subtract(double a, double b) {
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.subtract(b2).doubleValue();
} /**
* float 减运算
*
* @param a
* @param b
* @return
*/
public static float subtract(float a, float b) {
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.subtract(b2).floatValue();
} /**
* double 乘运算
*
* @param a
* @param b
* @return
*/
public static double multiply(double a, double b) {
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.multiply(b2).doubleValue();
} /**
* float 乘运算
*
* @param a
* @param b
* @return
*/
public static float multiply(float a, float b) {
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.multiply(b2).floatValue();
} /**
* double 除运算
*
* @param a
* @param b
* @return
*/
public static double divide(double a, double b) {
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.divide(b2).doubleValue();
} /**
* float 除运算
*
* @param a
* @param b
* @return
*/
public static float divide(float a, float b) {
BigDecimal b1 = new BigDecimal(Double.toString(a));
BigDecimal b2 = new BigDecimal(Double.toString(b));
return b1.divide(b2).floatValue();
}
}

另外在javascript中也存在精度计算的问题,没有什么好的方法,计算时使用parseFloat先转换,再取精度,写法为 parseFloat(xx.xxx).toFixed(2); //2表示取两位小数。

同时对于常用的需要将一个double转为BigDecimal时,应该使用BigDecimal.valueOf(0.1), 或者new BigDecimal("0.1"), 而不要直接将double类型作为构造方法的入参传入,这种写法有精度的问题。

最新文章

  1. JWT实现token-based会话管理
  2. RDBMS DML DDL
  3. BZOJ 3365 Distance Statistics 点分治
  4. 基本概率分布Basic Concept of Probability Distributions 5: Hypergemometric Distribution
  5. 二分匹配之最大权值匹配算法---KM模板
  6. Linux下双网卡绑定(bonding技术)
  7. div垂直居中 css div盒子上下垂直居中
  8. 查询mysql数据库中所有用户及用户权限
  9. [置顶] asp.net(c#)中相对路径(虚拟路径)和物理磁盘路径的转换
  10. 【宽搜】XMU 1039 Treausure
  11. GitLab 社区版 11.0.2用户管理教程
  12. c#串口测试
  13. 使用.mongorc.js移除哪些比较“危险”的shell辅助函数
  14. 关于 IPv6
  15. 关于docker容器和镜像的区别
  16. MyBatis 知识点
  17. ssh 执行命令并实时显示结果
  18. Vim文本编辑命令
  19. 什么是响应式编程——响应式Spring的道法术器
  20. CentOS中使用Shell脚本实现每天自动备份网站文件和数据库并上传到FTP中(转)

热门文章

  1. 如何实现数字lcd显示效果(原创)
  2. OD: Windows Kernel Debug
  3. OD: SEHOP
  4. tomcat startup.sh提示java.lang.OutOfMemoryError: PermGen space
  5. 类名.this与类名.class
  6. 使用Application_Error捕获站点错误并写日志
  7. 重置MySQL的root用户密码(Window)
  8. Apache 2.x+jboss6.1反向代理session共享问题设置
  9. 如何实现一个通用的IHttpHandler 万能的IHttpHandler HttpWebRequest文件上传
  10. 读书笔记 -part1