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

简介:

1,案例

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

 

Java代码   收藏代码
  1. @Test  
  2.     public void test_divide2() {  
  3.         String payAmountStr="1011";  
  4.         float f=Float.parseFloat(payAmountStr);  
  5.         float result=f/100f;  
  6.         System.out.println(String.valueOf(result*100));  
  7.     }  

 运行结果:1010.99994

 

但是预期结果是:1011

 

2,解决方法:使用BigDecimal

Java代码   收藏代码
  1. @Test  
  2.     public void test_divide() {  
  3.         String payAmountStr="1011";  
  4.         BigDecimal chanpayAcount=new BigDecimal(payAmountStr);  
  5.         BigDecimal bssAcount=  chanpayAcount.divide(new BigDecimal(100));  
  6.         System.out.println("使用BigDecimal");  
  7.         System.out.println(String.valueOf(bssAcount.multiply(new BigDecimal(100))));  
  8.     }  

 运行结果:

使用BigDecimal

1011.00

 

相关文章
|
5月前
银行定期存款利率,输入金额,输入年限,计算本息总额
银行定期存款利率,输入金额,输入年限,计算本息总额
61 0
|
2月前
|
存储 Java API
"揭秘!为何BigDecimal成为精准计算的守护神?告别浮点数误差,让每一分钱都精准无误!"
【8月更文挑战第11天】在编程中处理金融或科学计算时,常遇浮点数运算精度丢失问题。Java的`double`和`float`虽能覆盖广泛数值范围,但在特定小数运算上力有未逮。`BigDecimal`则以其独特的设计确保了精度。它位于`java.math`包内,通过`BigInteger`存储数值绝对值及`scale`表示小数位数,从而精确表示任意精度的小数。
37 4
|
5月前
微信和支付宝支付的金额不能超过两位小数,可以把后台超过两位小数的支付字符串修正为两位小数
微信和支付宝支付的金额不能超过两位小数,可以把后台超过两位小数的支付字符串修正为两位小数
41 0
|
5月前
TMA三均线股票期货高频交易策略的R语言实现
TMA三均线股票期货高频交易策略的R语言实现
|
5月前
【全网最精简】一行代码解决千万位以上的数字格式化为银行金额数字格式/货币格式(如:¥1,000,000,000.00)
【全网最精简】一行代码解决千万位以上的数字格式化为银行金额数字格式/货币格式(如:¥1,000,000,000.00)
1273:【例9.17】货币系统
1273:【例9.17】货币系统
118 0
|
11月前
数字 金额 相关 转换
数字 金额 相关 转换
50 0
|
测试技术
【解决方案 二十三】带单位的数值转大写人民币金额
【解决方案 二十三】带单位的数值转大写人民币金额
103 0
|
存储 C#
C#常见金额优选类型及其三种常用的取整方式
C#常见金额优选类型及其三种常用的取整方式
220 0
|
数据采集 机器学习/深度学习 Rust
高频交易数据如何产生和处理?
万物均有一体两面。高频交易作为当前常见的交易策略,需要较强的技术手段和较大的资金投入,同时也面临着监管制度趋严的现状。伴随着高频量化交易的快速发展,非凸科技致力于为量化机构提供适应新时代科技发展、符合国内实际情况的高频量化交易系统。
高频交易数据如何产生和处理?