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));//438572
System.out.println("String 类型值转换为Double 类型的值后的值为:" + Double.valueOf(amt) * 100); //438572.99999999994
String 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); //438573
System.out.println("amt of int:" + bd.intValue());//438573
时间: 2024-11-04 22:14:49

String to Double出现误差的相关文章

将String转换为Double并保留2位小数

? 1 2 3 4 5 6 7 8 9 10 11 12 13     //将money的分转化为元 public String coinToYuan(String coin) {     Double dd = Double.parseDouble(coin);     Double ddd = dd / 100;     if (dd % 100 == 0) {         int num = ddd.intValue();         return String.valueOf(n

string和double之间的相互转换

很多人都写过这个标题的文章,但本文要解决的是确保负数的string和double也可以进行转换. 代码如下: string转double 1 double stringToDouble(string num) 2 { 3 bool minus = false; //标记是否是负数 4 string real = num; //real表示num的绝对值 5 if (num.at(0) == '-') 6 { 7 minus = true; 8 real = num.substr(1, num.s

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

Java中String转换Double类型 double num1 = 0.0; String qq = "19.987"; num1 = Double.valueOf(qq.toString()); 太祖元年 Java小数点后留两位 double num1 =11; double num1 =21; String num1 =""; DecimalFormat df = new DecimalFormat(".00");num3 = df.fo

String to Double in swift

var value1:String = "1.1111" var value2:Double = String.bridgeToObjectiveC(value1)().doubleValue String to Double in swift

JAVA计算器(有无限加括号功能)+string与double互相转化

java老师布置的作业,要我们编个计算器,而且要有括号功能...编的恶心哪,600多行代码,调试来调试去终于能用了,但是估计还有bug. 有一个bug我自己知道,但是不影响正常使用:可以存在前导零,就是说可以有0087这种数字,计算器会认为这就是87,. 下面是两个截图,左边是输入,右边是输出. 这个计算器的核心算法就是对左边的字符串进行处理,得出右边的结果,其中要考虑到括号匹配.负号.乘除优先级等等问题,这一个算法写了200行. 因为字符串比较短,最多就几十,所以我的算法比较暴力,没有考虑时间

string与double的互相转换

#include <iostream> #include <string> #include <sstream> string DoubleToString(double Input) { stringstream Oss; Oss<<Input; return Oss.str(); } double StringToDouble(string Input) { double Result; stringstream Oss; Oss<<Inpu

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

1 String ss = "3.141592653"; 2 double value = Double.valueOf(ss.toString()); 原文地址:https://www.cnblogs.com/JeasonIsCoding/p/9858992.html

C++: string 转 int ;string转float;int 转string;double转char*

1.string转int std::string str1="700" int bid_v1 = atoi(str1.c_str()); 2.string转float std::string str2="6.78" float bid_p1 = atof(str2.c_str()); 3.int 转string int n =789; char t[256]; sprintf(t, "%d", n); string s(t) 4.double转c

什么时候用普通变量类型(int,string,guid,double)在各层之间传递参数,什么使用Model传递?

SelectUser(int UserId)    SelectUserByName(string username)    SelectUserByName(string username,string password)    SelectUserByEmail(string email)    SelectUserByEmail(string email,string password)    可以概括为:    SelectUser(userId)    SelectUser(user)