如何求数的精度 对于Double oneDouble = 33.3303300d;Double twoDouble = 333303300d;Long oneLong = -393030L;如何求他们的精度,就是最后一位非零数字所在精度,即输出---oneDouble--- 0.00001---twoDouble--- 100---oneLong--- 10 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 import java.math.*;public class GetScale { public static void main(String args[]){ double oneDouble = 33.3303300d; double twoDouble = 333303300d; BigDecimal bd = new BigDecimal(oneDouble + ""); BigDecimal bd2 = new BigDecimal(twoDouble + ""); System.out.println(bd.scale()); System.out.println(bd2.scale()); }}输出时5和-2,自己再处理下吧! 嗯,很好double oneDouble = 33.3303300d; double twoDouble = 333303300d; BigDecimal bd = new BigDecimal(oneDouble + "");BigDecimal bd2 = new BigDecimal(twoDouble + "");System.out.println("oneDouble:"+1/Math.pow(10, bd.scale()));System.out.println("oneDouble:"+1/Math.pow(10, bd2.scale()));输出:oneDouble:1.0E-5oneDouble:100.0就可以得到想要的,不过不知道当数比较复杂时,会不会丢精度。如果是这样:System.out.println("oneDouble:"+Math.pow(10, -1*bd.scale()));System.out.println("oneDouble:"+Math.pow(10, -1*bd2.scale()));则输出:oneDouble:9.999999999999999E-6oneDouble:100.0就丢了精度。 现在又碰到个问题:Long oneNum = 38900L;BigDecimal bd4 = new BigDecimal(oneNum + "");System.out.println("1oneNum:"+1/Math.pow(10, bd4.scale()));System.out.println("2oneNum:"+Math.pow(10, bd4.scale()));BigDecimal bd5 = new BigDecimal(oneNum.doubleValue() + "");System.out.println("3oneNum:"+1/Math.pow(10, bd5.scale()));System.out.println("4oneNum:"+Math.pow(10, bd5.scale()));输出:1oneNum:1.02oneNum:1.03oneNum:0.14oneNum:10.0却又变得与Double的数相反了。不管oneNum值是正的负的,类型是Float的还是Long对BigDecimal还是不了解 精度丢失是因为你计算导致的 想要精确控制精度 用BigDecimal类来做吧 但是,奇怪的是:如果是这样:BigDecimal bd4 = new BigDecimal(100.222+1000000000000d+"");则可以得到正确结果,也许是数不够大的原因,当然如果这样BigDecimal bd4 = new BigDecimal("99999999"+100.22);可以得到正确结果,但BigDecimal bd4 = new BigDecimal("99999999"+100);就又不行了以上原因,那位高人来解答一下!只要10000000000000不会比前面那个数小,而且不会溢出的话,还是可以将就着用的 急!junit测试类怎么打包成jar文件 java可以利用USB口输出信息吗 一个关于局部和全局变量赋值的问题...... 看不懂的一个小程序 编写类似ping命令的 log4J,如何一个线程写成一个日志? 关于一道笔试题:java数组求和 tomcat配连接池的问题 哪里下载JDK开发环境???????????? 问几个基础问题 谢谢~ 求一个算法的帖子地址????????????????? 什么时候用LinkedList?
public static void main(String args[]){
double oneDouble = 33.3303300d;
double twoDouble = 333303300d;
BigDecimal bd = new BigDecimal(oneDouble + "");
BigDecimal bd2 = new BigDecimal(twoDouble + "");
System.out.println(bd.scale());
System.out.println(bd2.scale());
}
}
输出时5和-2,自己再处理下吧!
double twoDouble = 333303300d;
BigDecimal bd = new BigDecimal(oneDouble + "");
BigDecimal bd2 = new BigDecimal(twoDouble + "");System.out.println("oneDouble:"+1/Math.pow(10, bd.scale()));
System.out.println("oneDouble:"+1/Math.pow(10, bd2.scale()));输出:oneDouble:1.0E-5
oneDouble:100.0就可以得到想要的,不过不知道当数比较复杂时,会不会丢精度。如果是这样:System.out.println("oneDouble:"+Math.pow(10, -1*bd.scale()));
System.out.println("oneDouble:"+Math.pow(10, -1*bd2.scale()));则输出:oneDouble:9.999999999999999E-6
oneDouble:100.0就丢了精度。
BigDecimal bd4 = new BigDecimal(oneNum + "");
System.out.println("1oneNum:"+1/Math.pow(10, bd4.scale()));
System.out.println("2oneNum:"+Math.pow(10, bd4.scale()));
BigDecimal bd5 = new BigDecimal(oneNum.doubleValue() + "");
System.out.println("3oneNum:"+1/Math.pow(10, bd5.scale()));
System.out.println("4oneNum:"+Math.pow(10, bd5.scale()));
输出:1oneNum:1.0
2oneNum:1.0
3oneNum:0.1
4oneNum:10.0却又变得与Double的数相反了。不管oneNum值是正的负的,类型是Float的还是Long
对BigDecimal还是不了解
当然如果这样
BigDecimal bd4 = new BigDecimal("99999999"+100.22);
可以得到正确结果,但
BigDecimal bd4 = new BigDecimal("99999999"+100);
就又不行了以上原因,那位高人来解答一下!只要10000000000000不会比前面那个数小,而且不会溢出的话,还是可以将就着用的