关于String转Double后计算值出错的问题解决

时间:2024-03-25 14:47:47

在做String转Double后一般的加减乘除都能得到正确结果有个别会出现偏差,比如:

String s1="0.21";

String s2="0.02";

double sum = Double.valueOf(s1)+Double.valueOf(s2);

或者

double d1=0.21;

double d2=0.02;

double sum = d1+d2;

得到的sum不是0.23而是0.22999999999999998

这里就会出现偏差了,所以为了解决这种问题,我写了一个求和的方法,减、乘、除等也只稍加修改即可,所以就不写出来了。

下面开始说明我的思路:

首先我把2个字符串s1和s2以小数点分割,分成整数部分和小数部分,如果没有小数点直接求和运算就能得到结果所以不考虑这个情况,接下来,我把分成整数和小数部分我都当成整数求和,那么就只要判断小数相加后有没进位就可,一般相加进位只有1,相乘就不是了(这里只说相加,如果最后你按照相加的逻辑推演不出相乘的方法你给我留言),最后把整数和小数部分一拼接就好了,输出的字符串就是结果了,你可以把这个String类型以任意你想要的int,double等类型返回也是可以的。

代码演示:

public void test() {
String s1="123.99";
String s2="12.886";
String[] shuZi1 = null,shuZi2 = null;
int zhengShu1=0,zhengShu10=0,zhengShu2=0,zhengShu20=0;
int shuZi1xiaoShuChangDu=0,shuZi2xiaoShuChangDu=0;
Integer xiaoShuHe=0,zhengShuHe=0;
double zongHe=0.0;
String jinWei="0";
//判断s1,s2是否有小数位
if(s1.indexOf(".") != -1) {  
shuZi1 = s1.split("\\.");
zhengShu1 = Integer.valueOf(shuZi1[0]);
zhengShu10 = Integer.valueOf(shuZi1[1]);
}else {
zhengShu1 = Integer.valueOf(s1);
}
if(s2.indexOf(".") != -1) { 
shuZi2 = s2.split("\\.");
zhengShu2 = Integer.valueOf(shuZi2[0]);
zhengShu20 = Integer.valueOf(shuZi2[1]);
}else {
zhengShu2 = Integer.valueOf(s2);
}
//计算小数位,短的数要乘上对应的10才可和长的数同级相加
if(zhengShu10 != 0 && zhengShu20 != 0) {
if(shuZi1[1].length() > shuZi2[1].length()) {
shuZi1xiaoShuChangDu = shuZi1[1].length();
int count = shuZi1[1].length() - shuZi2[1].length();
   for(int m=0;m<count;m++) {
   zhengShu20 = zhengShu20*10;
   }
}else {
shuZi2xiaoShuChangDu = shuZi2[1].length();
   int count = shuZi2[1].length() - shuZi1[1].length();
   for(int n=0;n<count;n++) {
   zhengShu10 = zhengShu10*10;
   }
}
xiaoShuHe = zhengShu20 + zhengShu10;
//如果小数部分相加大于原先最长长度说明有进位
if(xiaoShuHe.toString().length() > (shuZi1xiaoShuChangDu+shuZi2xiaoShuChangDu)) {
jinWei = xiaoShuHe.toString().substring(0, (xiaoShuHe.toString().length()-(shuZi1xiaoShuChangDu+shuZi2xiaoShuChangDu)));
}
}else {
xiaoShuHe = zhengShu20 + zhengShu10;
}
zhengShuHe = zhengShu2 + zhengShu1;
System.out.println("小数和="+xiaoShuHe+"进位="+jinWei);
System.out.println("整数和="+zhengShuHe);
if(!jinWei.equals("0")) {
zhengShuHe = zhengShuHe.intValue()+1;
String sum = zhengShuHe.toString() + "." + xiaoShuHe.toString().substring(1);
zongHe = Double.parseDouble(sum);
}else {
String sum = zhengShuHe.toString() + "." + xiaoShuHe.toString();
zongHe = Double.parseDouble(sum);
}
System.out.println("总和="+zongHe);
}

结果:

小数和=1876进位=1
整数和=135
总和=136.876

附上其中一段截图

关于String转Double后计算值出错的问题解决

这里s1和s2我都给的一个固定值,你把方法写成有参的返回double,即可得到想要的结果了。