今天碰到一个需求。关于小数点的处理,看起来很是简单的事情,却花了必定时间作了一些试验。最后简单总结一下,以便备忘。javascript
需求简化一下表达是这样的:前端
有A、B两列,A/B=C。这3列在数据库中都以decimal存放。java
在应用中,要求这3列,最多保留两位小数,去掉小数点后无心义的0。举例以下:mysql
3.03表示为3.03sql
3.30表示为3.3数据库
3.0表示为3后端
先后端都会改变这几个数据。函数
一、前端实现。(JavaScript)测试
前端javascript而言,由于小数点精度计算常常有偏差,为确保获得2位小数点,调用了toFixed函数。可是,toFixed之后,无论小数点后是否是0,都保留2位。spa
var a = 6.02;
var b = 3.01
var c = a/b.toFixed(2) ;//c获得了2.00
为了获得2,想了一个迂回的办法:c = a/b.toFixed(2)*100/100(若是是保留三位小数,则*1000/1000)
也能够这么作:
parseFloat("2.40").toFixed(2)*1 //parseFloat会去掉多余的0,可是toFixed在实际小数位不够的时候,会出现多余的0
用java.text.DecimalFormat("0.##")便可。
BigDecimal a = new BigDecimal(“6.02”);
BigDecimal b = new BigDecimal(“3.01”);
与js不一样,不能用*100/100的方式,由于java中BigDecimal的运算小数点是以公式中各项的最长小数点位数做为最终结果的小数点位数。这样处理后结果仍然是2位数。
用DecimalFormat(“0.##”)便可解决。
另外附上一篇其余人的文章,你们能够测试下:
一 java.text.DecimalFormat df=new java.text.DecimalFormat("#.##"); double d=3.14159; System.out.println(df.format(d)); 二 java.math.BigDecimal BigDecimal bd = new BigDecimal("3.14159265"); bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP); 三 class Test1{ public static void main(String[] args){ double ret = convert(3.14159); System.out.println(ret); } static double convert(double value){ long l1 = Math.round(value*100); //四舍五入 double ret = l1/100.0; //注意:使用 100.0 而不是 100 return ret; } } 四 double d = 13.4324; d=((int)(d*100))/100;