一.不直接使用float和double计算金钱的原因
java中涉及到浮点计算,就会有误差,
float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。
1 public class MoneyTest{ 2 3 public static void main(String[] args) { 4 System.out.println(2.00 - 1.10);// 0.8999999999999999 5 6 System.out.println(2.00D - 1.10D);// 0.8999999999999999 7 8 System.out.println(2.00F - 1.10F);// 0.9 9 System.out.println(Double.toString(2.00D));// 2.0 10 11 System.out.println(BigDecimal.valueOf(2.00).subtract(BigDecimal.valueOf(1.10)));// 0.9 12 System.out.println(BigDecimal.valueOf(2.00F).subtract(BigDecimal.valueOf(1.10F)));// 0.899999976158142 13 14 System.out.println(BigDecimal.valueOf(2.00D).subtract(BigDecimal.valueOf(1.10D)));// 0.9 15 16 System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));// 0.90 17 18 } 19 20 }
二.方法一:直接使用BigDecimal类(如果没有什么逻辑处理建议直接使用BigDecimal)
1.加减乘除
//加法
BigDecimal result1 = num1.add(num2);
//减法
BigDecimal result2 = num1.subtract(num2);
//乘法
BigDecimal result3 = num1.multiply(num2);
//绝对值
BigDecimal result4 = num3.abs();
//除法
BigDecimal result5 = num2.divide(num1,20,BigDecimal.ROUND_HALF_UP)

加减乘除使用了英文的加减乘除, 即add, substract, multiply和divide
2.大小比较
bigdemical.compareTo(bigdemical2) = 1,表示bigdemical大于bigdemical2;
bigdemical.compareTo(bigdemical2) = 0,表示bigdemical等于bigdemical2;
bigdemical.compareTo(bigdemical2) = -1,表示bigdemical小于bigdemical2;

两个BigDecimal值比较使用compareTo方法, 比较结果有-1, 0, 1, 分别表示小于, 等于, 大于; 对于0, 可以使用BigDecimal.ZERO表示!
3.小数位数及四舍五入规则
在项目中, 涉及到税费的计算, 计算的结果可能是小数点后面十几位, 那么怎么进行结算呢? 这就需要四舍五入这种东东了.
-
BigDecimal b = new BigDecimal("2.225667").setScale(2, BigDecimal.ROUND_DOWN);
-
System.out.println(b); //2.22 直接去掉多余的位数四舍五入精确的方法很多很多,此例子只是直接去掉多余的位数

3.数据类型
BigDecimal在进行入库时, 数据库选择decimal类型, 长度可以自定义, 如18; 小数点我们项目中用的是2, 保留2位小数. 此外还要注意的就是默认值, 一定写成0.00, 不要用默认的NULL, 否则在进行加减排序等操作时, 会带来转换的麻烦!
数据库字段类型:balance
decimal(18,2) DEFAULT '0.00' COMMENT '账户余额',java对象:直接使用 BigDecimal 作为参数类型;
三:方法二:使用分元转换类:如果金钱处理的逻辑很多建议使用分元转换
1 /** 2 * 将元变成分 如 0.01元 变成 1分 3 * 4 * @param str 5 * 金额(元) 6 * @return 7 */ 8 public static String moneyYuanToFen(String str) { 9 Double num = Double.parseDouble(str); 10 int result = (int) (num * 100); 11 return String.valueOf(result); 12 13 } 14 15 /** 16 * 将分变成元 100分 -> 1元 17 * 18 * @param amount 19 * 金额(分) 20 * @return 21 */ 22 public static String moneyFenToYuan(Long amount) { 23 return new BigDecimal(amount).divide(new BigDecimal(100)).setScale(2).toString(); 24 }
原文:https://blog.csdn.net/OliverAAAAAA/article/details/79230979