独角兽企业重金招聘Python工程师标准>>>
今天碰到一个需求。关于小数点的处理,看起来非常简单的事情,却花了一定时间做了一些试验。最后简单总结一下,以便备忘。
需求简化一下表达是这样的:
有A、B两列,A/B=C。这3列在数据库中都以decimal存放。
在应用中,要求这3列,最多保留两位小数,去掉小数点后无意义的0。举例如下:
3.03表示为3.03
3.30表示为3.3
3.0表示为3
前后端都会改变这几个数据。
1、前端实现。(JavaScript)
前端javascript而言,因为小数点精度计算经常有误差,为确保得到2位小数点,调用了toFixed函数。但是,toFixed以后,不管小数点后是不是0,都保留2位。
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;