java 金钱计算_Java中涉及到金钱计算方法的两种方式

一.不直接使用float和double计算金钱的原因

java中涉及到浮点计算,就会有误差,

float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。

1 public classMoneyTest{2

3 public static voidmain(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)

05a5becc9d2ea13c81d20b1937b07c01.png

加减乘除使用了英文的加减乘除, 即add, substract, multiply和divide

2.大小比较

bigdemical.compareTo(bigdemical2) = 1,表示bigdemical大于bigdemical2;

bigdemical.compareTo(bigdemical2) = 0,表示bigdemical等于bigdemical2;

bigdemical.compareTo(bigdemical2) = -1,表示bigdemical小于bigdemical2;

df3dacbfda8d9bd534bb8d3530b99a9e.png

两个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 直接去掉多余的位数

四舍五入精确的方法很多很多,此例子只是直接去掉多余的位数

460ddd7a649040549650fcc7a1717acd.png

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 *@paramstr5 * 金额(元)6 *@return

7 */

8 public staticString moneyYuanToFen(String str) {9 Double num =Double.parseDouble(str);10 int result = (int) (num * 100);11 returnString.valueOf(result);12

13 }14

15 /**

16 * 将分变成元 100分 -> 1元17 *18 *@paramamount19 * 金额(分)20 *@return

21 */

22 public staticString moneyFenToYuan(Long amount) {23 return new BigDecimal(amount).divide(new BigDecimal(100)).setScale(2).toString();24 }

原文:https://blog.csdn.net/OliverAAAAAA/article/details/79230979

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值