java double 不准确_用Java语言处理double类型的小数值不准确

本文主要向大家介绍了用Java语言处理double类型的小数值不准确,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

首先是从Excel里面读数据的时候,Excel里面的数据是数字,太大,其实也不是数字,就是个银行卡号,复制进去,就自动成数字啦,然后就变成科学计数法啦,在使用poi读取数据的时候,读出来的就是科学计数法的数字,tostring之后,就不是我们想要的数据啦,这是一种情况。

还有一种情况,就是Excel里面的小数比如,1.2读出来可能就是1.19999,这个就是double类型的小数的值不准确的问题啦。

说是可以使用BigDecimal类来解决这个问题,但是,这个类要想使用好,也得有一番实践操作的。

先看代码

[java]view plaincopy

/**

*BigDecimal的测试,要精确。

*还要使得科学计数法的数字,做完全的展示。

*/

privatestaticvoidtestBigDecimal(){

Doubled=1.6D;

//不准确的初始化

BigDecimalbigDecimal=newBigDecimal(d);

System.out.println(bigDecimal);

//使得结果精确的初始化姿势

bigDecimal=newBigDecimal(d.toString());

System.out.println(bigDecimal);

bigDecimal=newBigDecimal("6.214822313132341212666E+18");

System.out.println(bigDecimal.toPlainString());

}

再看下运行的结果。

可以看到差别了吗?

可以看到,这个构造函数传进去的参数类型不同,出来的结果,就很不一样。

所以,咱在使用这个类的时候,还是传个字符串类型的参数进去,这样就稳当点。

这样就解决啦,double类型的小数的不准确性的问题,不用去考虑,到底精确几位小数的问题。同时,还把科学计数法的数字,给格式化成OK的字符串来展示。

最后,就是为啥把这篇文章分在poi的分类里面,因为就是在读取Excel文档的数据的时候,发现的问题。

它读取每个cell的时候,会根据cell的类型不一样,获得的值也不一样。

还有就是,要是数字的话,他竟然还有科学计数法的问题,以及小数值不准确的问题,比如1.6,读出来可能就是1.59999

下面是获取 cell的值的方法

[java]view plaincopy

/**

*获取单元格数据内容为字符串类型的数据

*

*@paramcellExcel单元格

*@returnString单元格数据内容

*/

publicstaticStringgetCellStringValue(HSSFCellcell){

StringstrCell;

switch(cell.getCellType()){

caseHSSFCell.CELL_TYPE_STRING:

strCell=cell.getStringCellValue();

break;

caseHSSFCell.CELL_TYPE_NUMERIC:

Doublevalue=cell.getNumericCellValue();

BigDecimalbd1=newBigDecimal(Double.toString(value));

strCell=bd1.toPlainString();

break;

caseHSSFCell.CELL_TYPE_BOOLEAN:

strCell=String.valueOf(cell.getBooleanCellValue());

break;

caseHSSFCell.CELL_TYPE_BLANK:

strCell="";

break;

default:

strCell=null;

break;

}

returnstrCell;

}

重点就是当是数字类型的时候,就需要好好处理一下啦。不然,读取出来的数字要么是科学计数法,要么就是已经失去准确性的小数啦。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值