String to Double出现误差
场景描述
做实际项目的时候,由于使用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.73
Double amount = Double.valueOf(amt) * 100;
System.out.println("String 类型值转换为Double 类型的值后的值为========= " + (int)(Double.valueOf(amt) * 100));//
System.out.println("String 类型值转换为Double 类型的值后的值为:" + Double.valueOf(amt) * 100); //438572.99999999994
String amountStr = String.valueOf(amount.intValue());
System.out.println("Double类型值转换为String 类型的值后的值为:" + amountStr);//
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); //
System.out.println("amt of int:" + bd.intValue());//
String to Double出现误差的更多相关文章
- Java中String转换Double类型 Java小数点后留两位
Java中String转换Double类型 double num1 = 0.0; String qq = "19.987"; num1 = Double.valueOf(qq.to ...
- string和double之间的相互转换(C++)
很多人都写过这个标题的文章,但本文要解决的是确保负数的string和double也可以进行转换. 代码如下: string转double double stringToDouble(string nu ...
- string与double的互相转换
#include <iostream> #include <string> #include <sstream> string DoubleToString(dou ...
- POJ:2109-Power of Cryptography(关于double的误差)
Power of Cryptography Time Limit: 1000MS Memory Limit: 30000K Description Current work in cryptograp ...
- String转double失去精度问题
最近遇到一个坑,微信小程序中退款 19.9的字符串转double变成19.89,导致退不成功 . 坑死我了.现在把更改后的代码贴出来 public static void main(String[] ...
- vs c++ 将string转换为double
可以用atof()这个函数,但是这个函数的参数是char*类型的,因此需将string类型强制转换,方法为在函数的参数中写成 const_cast<const char *>(str.c_ ...
- c++ string 转double
#include <iostream>#include <sstream> //使用stringstream需要引入这个头文件using namespace std; Type ...
- Java:数值-字符串转换(String转Double)
String ss = "3.141592653"; double value = Double.valueOf(ss.toString());
- C++ string long double转char*
long long q = 10; ]; char* output; sprintf(s, "%ld", q); output = s; double ]; sprintf(s1, ...
随机推荐
- uploadify的使用
uploadify的使用 课程设计需要实现上传文件模块,本来ASP.NET是有内置的控件,但是ASP.NET MVC没有,所以就有两种方法:自定义和采用第三方插件.由于时间的关系,故采用第三方插件:u ...
- 不再害羞,过程比结果更重要;分享一套 CodeSmit 代码生成模板。
住博客园 5 年了,以前也发过一些博文,但都在 一天后 / 几周后 / 几年后 将它删了:因为感觉代码写得不好:不清晰或侵入太大,哪怕只有一句侵入. 可是最近重写一套 CodeSmith 代码生成模板 ...
- ADO.NET—两种连接模式
一.ADO.NET简介 ADO.NET的名称起源于ADO(ActiveX Data Objects),这是一个广泛的类组,用于在以往的Microsoft技术中访问数据.用来访问数据库,.NET环境下首 ...
- [APUE]进程控制(中)
一.wait和waitpid函数 当一个进程正常或异常终止时会向父进程发送SIGCHLD信号.对于这种信号系统默认会忽略.调用wait/waidpid的进程可能会: 阻塞(如果其子进程都还在运行); ...
- MySQL 性能优化神器 Explain 使用分析
简介 MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化. EXPLAIN 命令用法十分简单, 在 ...
- [.net] c# webservice
采用的工具VS2010生成工程 1. 生成webservice工程:建 ASP.NET 空WEB 应用程序. 2. 在建好的ASP.NET 空WEB应用程序中新建项“web 服务”. 完成上述内容工程 ...
- 【Java每日一题】20170111
20170110问题解析请点击今日问题下方的"[Java每日一题]20170111"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- Springmvc @CookieValue实用
页面直接请求, Controller代码 @RequestMapping("/testCookieValue") public String testCookieValue(@C ...
- JavaScript星级评分
事件onmouseover <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...
- Nginx 防止被域名恶意解析的方法
今天太倒霉了,发现通过IP无法访问服务器的80端口很无语,昨天都还好的啊,也没有修改过配置,其他端口又是正常的,防火墙也没问题.于是问了下机房,给了个崩溃的回复说我们的服务器有个域名没有备案被电信多次 ...