String转double失去精度问题及解决
更新时间:2023年07月11日 09:16:28 作者:老四就是我
这篇文章主要介绍了关于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]+"";
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot+Shiro+LayUI权限管理系统项目源码
本项目旨在打造一个基于RBAC架构模式的通用的、并不复杂但易用的权限管理系统,通过SpringBoot+Shiro+LayUI权限管理系统项目可以更好的帮助我们掌握springboot知识点,感兴趣的朋友一起看看吧2021-04-04
Java序列化JSON丢失精度问题的解决方法(修复Long类型太长)
这篇文章主要给大家介绍了关于Java序列化JSON丢失精度问题的解决方法,修复Long类型太长的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2022-03-03


最新评论