首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

精度有关问题

2012-01-18 
精度问题StringsTerms 118 StringsRate 5.1 StringsBillSum 345500 sEndorseTimes 3 sActu

精度问题
String   sTerms= "118 ";
String   sRate= "5.1 ";
String   sBillSum= "345500 "

sEndorseTimes= "3 ";
sActualint   = " "


sActualint   =   Terms*sRate*sBillSum/30000+sEndorseTimes*sRate*sBillSum/30000;

为什么sActualint最后结果是7086.36499999
我想得到的是7086.37

[解决办法]
昏倒,字符串变量做运算???
[解决办法]
在某些对数值精度要求非常的应用中直接使用java的float中的*,/运算可能会丢失精度,造成小量的误差,但是如果将这些误差相加可能会放大。

如System.out.println(534.2 / 100);
执行的结果却是5.3420000000000005
System.out.println(4.015 * 100);执行的结果是401.49999999999994
都有误差。

解决方案使用BigDecimal,如:
System.out.println((new BigDecimal( "123.3 ")).divide(new BigDecimal( "100 ")));
System.out.println((new BigDecimal( "4.015 ")).multiply(new BigDecimal( "100 ")));

但是如果依然使用:
System.out.println((new BigDecimal(123.3)).divide(new BigDecimal(100)));
System.out.println((new BigDecimal(4.015)).multiply(new BigDecimal(100)));

原因是因为在内存中存储浮点数的方式和整型不一样,将浮点数传入函数时就已经有差距了,所以需要传入字符串。
如果是数据库中存储的浮点型数据,则需要使用ResultSet.getBigDecimal得到BigDecimal再进行运算
[解决办法]
这是长精度,不是短精度。

热点排行
Bad Request.