场景描述

做实际项目的时候,由于使用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出现误差的更多相关文章

  1. Java中String转换Double类型 Java小数点后留两位

    Java中String转换Double类型 double num1 = 0.0; String qq = "19.987"; num1 = Double.valueOf(qq.to ...

  2. string和double之间的相互转换(C++)

    很多人都写过这个标题的文章,但本文要解决的是确保负数的string和double也可以进行转换. 代码如下: string转double double stringToDouble(string nu ...

  3. string与double的互相转换

    #include <iostream> #include <string> #include <sstream> string DoubleToString(dou ...

  4. POJ:2109-Power of Cryptography(关于double的误差)

    Power of Cryptography Time Limit: 1000MS Memory Limit: 30000K Description Current work in cryptograp ...

  5. String转double失去精度问题

    最近遇到一个坑,微信小程序中退款 19.9的字符串转double变成19.89,导致退不成功 . 坑死我了.现在把更改后的代码贴出来 public static void main(String[] ...

  6. vs c++ 将string转换为double

    可以用atof()这个函数,但是这个函数的参数是char*类型的,因此需将string类型强制转换,方法为在函数的参数中写成 const_cast<const char *>(str.c_ ...

  7. c++ string 转double

    #include <iostream>#include <sstream> //使用stringstream需要引入这个头文件using namespace std; Type ...

  8. Java:数值-字符串转换(String转Double)

    String ss = "3.141592653"; double value = Double.valueOf(ss.toString());

  9. C++ string long double转char*

    long long q = 10; ]; char* output; sprintf(s, "%ld", q); output = s; double ]; sprintf(s1, ...

随机推荐

  1. JUC锁机制

    JUC锁机制(Lock)学习笔记,附详细源码解析 JUC锁机制(Lock)学习笔记,附详细源码解析 2013-08-22 20:03 by CM4J, 56 阅读, 0 评论,收藏, 编辑 锁机制学习 ...

  2. 总结C++中取成员函数地址的几种方法

    这里, 我整理了4种C++中取成员函数地址的方法, 第1,2,4种整理于网上的方法, 第3种cdecl_cast是我自己想到的. 其中, 第4种(汇编)的方法不能在VC6上编译通过. 推荐使用第1,2 ...

  3. wget ( download the whole page from the website )

    ---恢复内容开始--- wget -m -e robots=off -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1 ...

  4. Sublime Text快捷键:

    Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W:关闭所有打开文件 Ctrl+Shift+V ...

  5. 设计模式之 - 工厂方法模式 (Factory Method design pattern)

    1. 模式意图:  定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 2. 别名(Virtual Constructor) 3. 结构 4. 工厂方法模式C ...

  6. 黑马程序员:Java基础总结----JavaBean 内省

    黑马程序员:Java基础总结 JavaBean 内省   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! JavaBean  内省 软件包 java.beans 包含与开 ...

  7. CSS3的radial-gradient(径向渐变)

    所谓径向渐变,如图下,类似光晕 语法: radial-gradient(  [    [渐变大小]?    [ at 渐变圆心坐标]?  ,]?  颜色[ 开始位置]  [,颜色[ 开始位置]]+); ...

  8. python——爬虫

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕 ...

  9. R语言 决策树算法

    定义: 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解 ...

  10. svn 目录设置为 不提交 忽略

    svn 忽略  以下文件 和目录 (不提交) runningtime --选中 tortoiseSVN --unversion and add to ignore list web workspace ...