我正在使用java apache阅读Excel数据。我在读取869.87929(excel)等双值时遇到格式问题到869.8792899999999(在java中)。
我正在使用以下文件来读取Excel数据。
1. Schema.csv:SheetName,2-int-Double
2. File.xls:
col1 | COL2 123 | 869.87929
示例代码:
if(type.equals("Double")){
Double fval=Double.parseDouble(content[i-1]);
String sval=fval.toString();
listObjects.add(new Double(Double.parseDouble(sval)));
}
注意:从schema.csv&中输入。来自file.xls的content []值
答案 0 :(得分:1)
Double不能保持精度。 Preffered使用BigDecimal。我相信这是你的问题。
https://blogs.oracle.com/CoreJavaTechTips/entry/the_need_for_bigdecimal
答案 1 :(得分:1)
没有必要将数字来回转换为字符串,因为这不应该做任何有用的事情。
尝试
listObjects.add(new BigDecimal(content[i-1]));
通过舍入可以做到
listObjects.add(new BigDecimal(content[i-1]).setScale(9, RoundingMode.HALF_UP));
虽然我怀疑在此之前发生了舍入错误,因为这应该与
基本相同listObjects.add(new Double(content[i-1]));
通过舍入可以做到
double d = Double.parseDouble(content[i-1]);
double round9 = Math.round(d * 1e9) / 1e9;
listObjects.add((Double) round9);
这些数字与精度为double的数字大致相同,此处不应出现其他错误(即错误可能在此之前)
答案 2 :(得分:1)
如果您使用Apache POI - 您可以使用getCellType()==Cell.CELL_TYPE_NUMERIC
来自Cell界面的getNumericCellValue()
。