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]+"";
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Spring 中jdbcTemplate 实现执行多条sql语句示例
本篇文章主要介绍了Spring 中jdbcTemplate 实现执行多条sql语句示例,可以对多个表执行多个sql语句,有兴趣的可以了解一下。2017-01-01
SpringMVC中解决@ResponseBody注解返回中文乱码问题
这篇文章主要介绍了SpringMVC中解决@ResponseBody注解返回中文乱码问题, 小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-04-04
MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectO
本文主要介绍了MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2022-03-03


最新评论