上周遇到个需求是上传文件的大小不能超过5M,因为想尝试着获取准确值,所以使用了bigdecimal类来计算,而通常使用的float和double在计算时是会丢失精度的。
BigDecimal常用来获取精确的计算结果,float和double类型主要是为了科学计算和工程计算而设计的,并不会提供完全精确的结果。
long fileSize1 = 3450; //小于5M
long fileSize2 = 6349000; //大于5M
long fileSize3 = 5242880; //等于5M
BigDecimal size1 = new BigDecimal(fileSize1 / 1024.0 / 1024.0); // size1 = 0.0032901763916015625
BigDecimal size2 = new BigDecimal(fileSize2 / 1024.0 / 1024.0); // size2 = 6.05487823486328125
BigDecimal size3 = new BigDecimal(fileSize3 / 1024.0 / 1024.0); // size3 = 5
int compareResult1 = size1.compareTo(new BigDecimal(5));
int compareResult2 = size2.compareTo(new BigDecimal(5));
int compareResult3 = size3.compareTo(new BigDecimal(5));
System.out.println("compareResult1 = " + compareResult1); //小于5,结果为-1
System.out.println("compareResult2 = " + compareResult2); //大于5,结果为1
System.out.println("compareResult3 = " + compareResult3); //等于5,结果为0
float floatResult1 = (float) (fileSize1 / 1024.0 / 1024.0); //0.0032901764
float floatResult2 = (float) (fileSize2 / 1024.0 / 1024.0); //6.054878
float floatResult3 = (float) (fileSize3 / 1024.0 / 1024.0); //5.0
使用BigDecimal的compareTo方法来将结果进行对比。
根据代码可以看出float和BigDecimal值的区别。