博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
String to Double出现误差
阅读量:5011 次
发布时间:2019-06-12

本文共 1212 字,大约阅读时间需要 4 分钟。

场景描述

做实际项目的时候,由于使用Double类的valueOf得到一个用String类型保存的金额参数(单位为元),当需要转换成以分为单位即整形表示(Integer类表示)时,需要用之前得到的double数据乘以100,强制将它转换成int类型的数据。可是结果可能会出现一分钱的误差,这会是一个很大的bug,以下模拟了问题的现象以及提出了解决问题的办法。

1、将String类型的数据用Double.valueOf(param)转换后乘以一个整数,使得恰好它的小数点后的数字值为全为0,但是会出现精度问题

String  amt = "4385.73";System.out.println("String 类型值转换为Double 类型的值后的值为:" + Double.valueOf(amt));//4385.73Double amount = Double.valueOf(amt) * 100;System.out.println("String 类型值转换为Double 类型的值后的值为========= " + (int)(Double.valueOf(amt) * 100));//438572System.out.println("String 类型值转换为Double 类型的值后的值为:" + Double.valueOf(amt) * 100); //438572.99999999994String amountStr = String.valueOf(amount.intValue());System.out.println("Double类型值转换为String 类型的值后的值为:" + amountStr);//438572

2、解决办法,使用BigDecimal类代替Double类来解决金额转换的精度问题

String  amt = "4385.73";BigDecimal bd=new BigDecimal(amt);//设置小数位数,第一个变量是小数位数,第二个变量是取舍方法(四舍五入)bd=bd.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP);System.out.println("amt of BigDecimal:"+ bd); //438573//转化为字符串输出String OutString=bd.toString();System.out.println("amt of String:"+ OutString); //438573System.out.println("amt of int:" + bd.intValue());//438573

 

转载于:https://www.cnblogs.com/xitangjuanjuan/p/5559296.html

你可能感兴趣的文章
ch02 fundamental definition 01
查看>>
JSON解析
查看>>
Position is everything?(css定位学习的一些心得)(一)
查看>>
如何提高编程水平
查看>>
Jquery Uploadify3.21.与2.1版本 使用中存在的问题--记录三
查看>>
Linux查看进程的内存占用情况 分类: ubuntu ...
查看>>
[BZOJ 2818]Gcd
查看>>
FORM值传递与地址传递
查看>>
(译)yaml快速教程
查看>>
C:大数相加
查看>>
160. Intersection of Two Linked Lists
查看>>
人生苦短,我用python-- Day11
查看>>
JAVA Bean
查看>>
ehcache memcache redis 三大缓存男高音_转
查看>>
curd_3
查看>>
百度地图API示例之设置地图显示范围
查看>>
Java构造方法、重载及垃圾回收
查看>>
.Net Core AES加密解密
查看>>
Spring Quartz实现任务调度
查看>>
python | 桶排序、冒泡排序、选择排序、去重
查看>>