String转double失去精度问题及解决
作者:老四就是我
这篇文章主要介绍了关于String转double失去精度问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
String转double失去精度问题
最近遇到一个坑,19.9的字符串转double变成19.89,坑死我了。
现在把更改后的代码贴出来
String s = "19.9"; BigDecimal temp = BigDecimal.valueOf(Double.valueOf(s)); // 将temp乘以100 temp = temp.multiply(BigDecimal.valueOf(100)); int sum = temp.intValue(); System.out.println(sum);
这样亲测不会失去精度。最后说一句,细节很重要,特别是字符串转其他类型的时候。
Java精度丢失之String转Double转int
项目遇到一种需求
服务器返回我“0.850”,我需要显示八五折
看起来很简单,于是代码出来了:
Double d = Double.parseDouble("0.850"); int result = (int) (d*100);
随便找了两个数试了试都没问题就以为大功告成了,谁知道测试的同事告诉我0.570显示的是56而不是57,我抱着怀疑的态度验证了一下,的确是我错了!
我心里一惊,是不是还有其他的特殊数字也会出现这种诡异的现象呢?
public static void main(String[] args) { for(int i=0;i<10;i++){ for (int j=0;j<10;j++){ for(int k=0;k<10;k++){ getUnNormalNumber(i,j,k); } } } } private static void getUnNormalNumber(int i,int j,int k){ String test = "0." + i + j + k; Double d = Double.parseDouble(test); int result = (int) (d*100); if(result/10==i&&result%10==j){ }else { System.out.println(test); } }
经过验证,果然有三个数是特殊的数字!
0.290
0.570
0.580
解决办法
private static String getSuitableString(String test) { String array[] = test.split("\\."); if(array[1]==null) { return ""; } char[] chars = array[1].toCharArray(); if (chars.length>=2){ return chars[0]+""+chars[1]; }else { return chars[0]+""; } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。