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, ...
随机推荐
- 64位CentOS 6.0下搭建LAMP环境
系统环境:Centos6.0 x64 1.确认搭建LAMP所需要的环境是否已经安装 [root@centos6 ~]# rpm -q make gcc gcc-c++ zlib-devel libai ...
- service structure flowchart [mobile to server via HTTP RESTful API and TCP/IP in a map]
mobile to server in RESTful and TCP/IP way
- .Net里的Attribute 学习
.Net里的Attribute 学习 前两天看到书里边讲Attribute定制,结合了网上的资料,自己做了简单的登录功能,并结合了某些设计模式,有兴趣的朋友可以看下.由于时间原因,没有做过多的说明,直 ...
- java输出万年历
import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class M ...
- Android KeyLogger Demo
@author: dlive 代码见github: https://github.com/Dliv3/Android-KeyLogger-Demo 前言 之前开发过一个Android的木马,其中Key ...
- 高可用的池化 Thrift Client 实现(源码分享)
本文将分享一个高可用的池化 Thrift Client 及其源码实现,欢迎阅读源码(Github)并使用,同时欢迎提出宝贵的意见和建议,本人将持续完善. 本文的主要目标读者是对 Thrift 有一定了 ...
- memcached缓存技术
初学memcached缓存技术,如果文章写得不好还请谅解 应用环境:win7 实现环境:cmd,eclipse Memcached简洁而强大.它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存 ...
- 【转】关于python中re模块split方法的使用
注:最近在研究文本处理,需要用到正则切割文本,所以收索到了这篇文章,很有用,谢谢原作者. 原址:http://blog.sciencenet.cn/blog-314114-775285.html 关于 ...
- 关于CachedRowSetImpl类
全称: com.sun.rowset.CachedRowSetImpl 父类: javax.sql.rowset.BaseRowSet 实现的接口: javax.sql.RowSet javax.sq ...
- The Linux Mint 17.1:Eclipse Run The C++ And Python Configoration
p { margin-bottom: 0.1in; line-height: 120% } # Copyright (c) 2016, 付刘伟 (Liuwei Fu)# All rights rese ...