如题,近期需要做一个对于数据要求特别精确的东西,但java对于浮点型小数的运算好像不是很精确,不知如何解决,望高手指教。
比如在java中 System.out.println(10000*1.005);时,竟然输出10049.99999999997
有什么好的处理办法请指教,不能用保留2位小数或者四舍五入的方法来实现,因为会影响到后边数据的计算,就只要实现10000*1.005直接等于10050.00的方式,而不是通过四舍五入或保留小数来实现,谢谢
比如在java中 System.out.println(10000*1.005);时,竟然输出10049.99999999997
有什么好的处理办法请指教,不能用保留2位小数或者四舍五入的方法来实现,因为会影响到后边数据的计算,就只要实现10000*1.005直接等于10050.00的方式,而不是通过四舍五入或保留小数来实现,谢谢
用BigDecimal吧
new BigDemial(10000).multiply(new BigDecimal(1.005))
但我想要的是10050.00这个数值
这和浮点数的定义有关(IEEE standard 754)。double的精度要比float高很多,通常的精度要求,double应该都能满足,
如果你要求完全不能损失精度,我估计你只能找一些特定的算法了。或者使用数据库的number类型也是一个办法,oracle的number数据类型是精确的。
我记得我编过一个扎金花游戏,里面随机产生数用的是int a=math.random()*9+1;
你看上去是可以产生1到10的随机数,但是其实他最大只能到9,就是因为random()产生的是float的数.他只能精确到0.99999,永远倒不了1不过我觉得肯定是有办法的,但是我也不知道,等待高手!!!
BigDecimal x = new BigDecimal("10000");
BigDecimal y = new BigDecimal("1.005");
BigDecimal z = x.multiply(y);
z.setScale(2, RoundingMode.HALF_UP);
z就是精确解z.setScale(2, RoundingMode.HALF_UP);就是lz后面所要的那个解要注意的是构造BidDecimal,一定要用String去构造,千万不要用int,float,double去构造,哪怕new BigDecimal(0)也不可以,一定要用new BigDecimal("0")
涉及到精度问题.精度上主要的问题,是在于
比如将十进制的0.1转化二进制数,结果是一个二进制的循环数,0.1并不能被二进制数精确表示,所以会出现楼主的问题
比如:
double dbl1 = 10000;
double dbl2 = 1.005;
System.out.println(10000*1.005);
也是一样的10049.99999999997
BigDecimal(Double)构造器将用它的参数的精确度实例化,同样返回的是一个小数一堆的数
应该这样:
System.out.println(new BigDecimal("10000").multiply(new BigDecimal("1.005")));