将excel数据读入Java时的格式问题

将excel数据读入Java时的格式问题,java,excel,apache-poi,export-to-csv,Java,Excel,Apache Poi,Export To Csv,我正在使用JavaApache读取Excel数据。我在将诸如869.87929(excel)之类的双精度值读入869.879289999999(java)时遇到了格式问题 我正在使用以下文件读取excel数据 1.Schema.csv:SheetName,2-int-Double 2.File.xls: col1 | col2 123 | 869.87929 示例代码: if(type.equals("Double")){ Double fval=Double.parse

我正在使用JavaApache读取Excel数据。我在将诸如869.87929(excel)之类的双精度值读入869.879289999999(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)));
        }

注意:键入from schema.csv&content[]文件.xls中的值不利于保持精度。Prefered使用的是BigDecimal。我相信这是你的问题


双精度不利于保持精度。Prefered使用的是BigDecimal。我相信这是你的问题


双精度不利于保持精度。Prefered使用的是BigDecimal。我相信这是你的问题


双精度不利于保持精度。Prefered使用的是BigDecimal。我相信这是你的问题


将数字来回转换为字符串没有意义,因为这样做没有任何用处

试着做

listObjects.add(new BigDecimal(content[i-1]));
用四舍五入你可以做到

listObjects.add(new BigDecimal(content[i-1]).setScale(9, RoundingMode.HALF_UP));
double d = Double.parseDouble(content[i-1]);
double round9 = Math.round(d * 1e9) / 1e9;
listObjects.add((Double) round9);
虽然我怀疑舍入误差在这一点之前就已经发生了,因为这应该做与

listObjects.add(new Double(content[i-1]));
用四舍五入你可以做到

listObjects.add(new BigDecimal(content[i-1]).setScale(9, RoundingMode.HALF_UP));
double d = Double.parseDouble(content[i-1]);
double round9 = Math.round(d * 1e9) / 1e9;
listObjects.add((Double) round9);

这与数字在double精度范围内的情况基本相同,这里不应该有额外的错误(即,错误可能在这一点之前)

将数字前后转换为字符串没有意义,因为这不应该做任何有用的事情

试着做

listObjects.add(new BigDecimal(content[i-1]));
用四舍五入你可以做到

listObjects.add(new BigDecimal(content[i-1]).setScale(9, RoundingMode.HALF_UP));
double d = Double.parseDouble(content[i-1]);
double round9 = Math.round(d * 1e9) / 1e9;
listObjects.add((Double) round9);
虽然我怀疑舍入误差在这一点之前就已经发生了,因为这应该做与

listObjects.add(new Double(content[i-1]));
用四舍五入你可以做到

listObjects.add(new BigDecimal(content[i-1]).setScale(9, RoundingMode.HALF_UP));
double d = Double.parseDouble(content[i-1]);
double round9 = Math.round(d * 1e9) / 1e9;
listObjects.add((Double) round9);

这与数字在double精度范围内的情况基本相同,这里不应该有额外的错误(即,错误可能在这一点之前)

将数字前后转换为字符串没有意义,因为这不应该做任何有用的事情

试着做

listObjects.add(new BigDecimal(content[i-1]));
用四舍五入你可以做到

listObjects.add(new BigDecimal(content[i-1]).setScale(9, RoundingMode.HALF_UP));
double d = Double.parseDouble(content[i-1]);
double round9 = Math.round(d * 1e9) / 1e9;
listObjects.add((Double) round9);
虽然我怀疑舍入误差在这一点之前就已经发生了,因为这应该做与

listObjects.add(new Double(content[i-1]));
用四舍五入你可以做到

listObjects.add(new BigDecimal(content[i-1]).setScale(9, RoundingMode.HALF_UP));
double d = Double.parseDouble(content[i-1]);
double round9 = Math.round(d * 1e9) / 1e9;
listObjects.add((Double) round9);

这与数字在double精度范围内的情况基本相同,这里不应该有额外的错误(即,错误可能在这一点之前)

将数字前后转换为字符串没有意义,因为这不应该做任何有用的事情

试着做

listObjects.add(new BigDecimal(content[i-1]));
用四舍五入你可以做到

listObjects.add(new BigDecimal(content[i-1]).setScale(9, RoundingMode.HALF_UP));
double d = Double.parseDouble(content[i-1]);
double round9 = Math.round(d * 1e9) / 1e9;
listObjects.add((Double) round9);
虽然我怀疑舍入误差在这一点之前就已经发生了,因为这应该做与

listObjects.add(new Double(content[i-1]));
用四舍五入你可以做到

listObjects.add(new BigDecimal(content[i-1]).setScale(9, RoundingMode.HALF_UP));
double d = Double.parseDouble(content[i-1]);
double round9 = Math.round(d * 1e9) / 1e9;
listObjects.add((Double) round9);


这些与精度在double内的数字基本相同,这里不应该有额外的错误(即,错误可能在这一点之前)

如果使用Apache POI,可以使用
getCellType()==Cell.Cell\u TYPE\u NUMERIC
比较和
getNumericCellValue()
来自接口。

如果您使用Apache POI-您可以使用
getCellType()==Cell.Cell\u TYPE\u NUMERIC
比较和
getNumericCellValue()
来自接口。

如果您使用Apache POI-您可以使用
getCellType()==Cell.Cell\u TYPE\u NUMERIC
比较和
getNumericCellValue()
来自接口。

如果您使用ApachePOI,您可以使用
getCellType()==Cell.Cell\u TYPE\u NUMERIC
比较和
getNumericCellValue()
来自接口。

您是否严重担心1E-13的差异??If(TYPE.equals(“Double”){String str=content[i-1];///System.out.println(str);BigDecimal d=newbigdecimal(str);listObjects.add(d);}如果我打印str,它的值显示为869.87928999999。但我需要得到str值为869.87929。我怎么能得到它?可能是重复的?你真的担心1E-13的差异吗?如果(type.equals(“Double”){String str=content[I-1];//System.out.println(str);BigDecimal d=new BigDecimal(str);listObjects.add(d);}如果我打印str,它的值显示为869.87928999999。但我需要得到str值为869.87929。我怎么能得到它?可能是重复的?你真的担心1E-13的差异吗?如果(type.equals(“Double”){String str=content[I-1];//System.out.println(str);BigDecimal d=new BigDecimal(str);listObjects.add(d);}如果我打印str,它的值显示为869.87928999999。但我需要得到str值为869.87929。我怎么能得到它?可能是重复的?你真的担心1E-13的差异吗?如果(type.equals(“Double”){String str=content[I-1];//System.out.println(str);BigDecimal d=new BigDecimal(str);listObjects.add(d);}如果我打印str,它的值显示为869.87928999999。但我需要得到str值为869.87929。如何获取它?if(type.equals(“Double”){String str=content[I-1];//System.out.println(str);BigDecimal d=new BigDecimal(str);listObjects.add(d);}的可能重复项如果我打印str,它的值显示为869.87928999999。但我需要得到str值为869.87929。我怎么能得到它?@Stone,因为我怀疑你的号码在来源处有舍入错误。要删除
9
s,需要对结果进行四舍五入。你能舍入到小数点后6位或9位吗?@Stone关于舍入的例子,请看我的答案。谢谢Peter。在某些情况下,我们需要excel中的9位小数。在这种情况下,当我们将小数点后6位四舍五入时,它可能会失败。例如excel值为0.737837838,将小数点后6位四舍五入,我们没有得到java中的excel值。@Stone将代码更改为小数点后9位。我怀疑excel在显示错误时隐藏了错误,我不知道excel用于此的规则,但我怀疑它删除了一个数字