最近遇到一个这样的需求,需要提示用户一个double类型的值的变化;我理所当然的将原来的值存入共享,那么问题来了,share不支持存储double,然后我用了两种方式,
一,存字符串取的时候转;二,乘以100(double只有两位小数)取的时候除.结果暴露了一个很严重的问题
先问问大家:double aa = 2.3;
new Double(aa*100/1).intValue()这个值会是多少?
230? no 是229,你没有看错,是229,为什么会出现这样的问题,因为计算机在保存double类型的数字是是用的科学计算法,在强制将double转成int时会出现一些数据丢失,非常大的数据丢失.
以上是存int出现的问题
存String呢,变化后的值比变化前的值大0.4,逼出来却是0.400000000000035,原因同上.
那么怎么办呢?
我采用的是用int存,四舍五入保留两位小数
方法一:{
double c=3.154215;
java.text.DecimalFormat myformat=new java.text.DecimalFormat("0.00");
String str = myformat.format(c);
}
方式二:{
java.text.DecimalFormat df =new java.text.DecimalFormat("#.00");
df.format(你要格式化的数字);
例:new java.text.DecimalFormat("#.00").format(3.1415926)
#.00 表示两位小数 #.0000四位小数 以此类推...
}
方式三:{
double d = 3.1415926;
String result = String .format("%.2f");
%.2f %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型
}
}
四舍五入 {
double f = 111231.5585;
BigDecimal b = new BigDecimal(f);
//保留2位小数
double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}