支付交易中遇到浮点数精度的问题

简介: <div class="markdown_views"><p><strong>1,案例</strong> <br>支付平台的单位是分,而业务系统的单位是元,所以传到支付系统时要乘以100</p><pre class="prettyprint"><code class="language-java hljs "><span class="hljs-annotation">

1,案例
支付平台的单位是分,而业务系统的单位是元,所以传到支付系统时要乘以100

@Test
    public void test_divide2() {
        String payAmountStr="1011";
        float f=Float.parseFloat(payAmountStr);
        float result=f/100f;
        System.out.println(String.valueOf(result*100));
    }

运行结果:1010.99994
运行结果不精确!!!

但是预期结果是:1011

2,解决方法:使用BigDecimal

@Test
    public void test_divide() {
        String payAmountStr="1011";
        BigDecimal chanpayAcount=new BigDecimal(payAmountStr);
        BigDecimal bssAcount=  chanpayAcount.divide(new BigDecimal(100));
        System.out.println("使用BigDecimal");
        System.out.println(String.valueOf(bssAcount.multiply(new BigDecimal(100))));
    }

运行结果:
使用BigDecimal
1011.00
使用BigDecimal

相关文章
|
8月前
银行定期存款利率,输入金额,输入年限,计算本息总额
银行定期存款利率,输入金额,输入年限,计算本息总额
132 0
|
8月前
|
存储 安全 前端开发
利用正则表达式取出“积分:9.0/余额:103.25”里面的数字
利用正则表达式取出“积分:9.0/余额:103.25”里面的数字
56 0
|
8月前
微信和支付宝支付的金额不能超过两位小数,可以把后台超过两位小数的支付字符串修正为两位小数
微信和支付宝支付的金额不能超过两位小数,可以把后台超过两位小数的支付字符串修正为两位小数
81 0
数字 金额 相关 转换
数字 金额 相关 转换
74 0
|
测试技术
【解决方案 二十三】带单位的数值转大写人民币金额
【解决方案 二十三】带单位的数值转大写人民币金额
121 0
|
算法
红包随机算法,给定一定的金额,一定的人数,保证每个人都能随机获得一定的金额。...
红包随机算法,给定一定的金额,一定的人数,保证每个人都能随机获得一定的金额。...
253 0
|
存储 算法 Java
怒刷力扣(二进制求和)
二进制求和,其实和上一题有着异曲同工之妙。但正是这异曲同工之妙让我陷入了固化思维,将简单的问题复杂化。
111 0
怒刷力扣(二进制求和)
|
存储 C#
C#常见金额优选类型及其三种常用的取整方式
C#常见金额优选类型及其三种常用的取整方式
262 0
|
存储 Java 数据库
金融系统中正确的金额计算及存储方式
昨天微信群里在讨论金额计算及存储的话题,今天特来结贴一下。 经典的精度丢失问题 Java中的类型float、double用来做计算会有精度丢失问题,下面来看下面的示例。
397 0