Java 使用Apache POI读取Excel文件中的数值时出现问题
我有一列数字,值为0.142,但转换为0.14200000000000002 这是我的代码,我使用cell.getNumericCellValue()Java 使用Apache POI读取Excel文件中的数值时出现问题,java,excel,apache-poi,Java,Excel,Apache Poi,我有一列数字,值为0.142,但转换为0.14200000000000002 这是我的代码,我使用cell.getNumericCellValue() 浮点数,正如您在10进制编号系统(即0-9)中所理解的那样,无法用二进制(即0-1)准确表示。因此,大多数情况下(从编程语言构造中)您将看到的是该值的近似值 在您的情况下,如果您不关心超过千分之一位置的值的精度,您可以使用: 仅供参考,poi的bug tracker上已询问此问题,并已关闭为“已解决无效” 此外,作为验证上述内容的有趣小实验,在j
浮点数,正如您在10进制编号系统(即0-9)中所理解的那样,无法用二进制(即0-1)准确表示。因此,大多数情况下(从编程语言构造中)您将看到的是该值的近似值 在您的情况下,如果您不关心超过千分之一位置的值的精度,您可以使用: 仅供参考,poi的bug tracker上已询问此问题,并已关闭为“已解决无效” 此外,作为验证上述内容的有趣小实验,在jshell会话中执行以下操作:
% jshell
| Welcome to JShell -- Version 11
| For an introduction type: /help intro
jshell> 0.1*0.1
$1 ==> 0.010000000000000002
你会期望上面的答案只有0.01;然而,事实并非如此。浮点数,正如您在10进制编号系统(即0-9)中所理解的那样,无法准确地用二进制(即0-1)表示。因此,大多数情况下(从编程语言构造中)您将看到的是该值的近似值 在您的情况下,如果您不关心超过千分之一位置的值的精度,您可以使用: 仅供参考,poi的bug tracker上已询问此问题,并已关闭为“已解决无效” 此外,作为验证上述内容的有趣小实验,在jshell会话中执行以下操作:
% jshell
| Welcome to JShell -- Version 11
| For an introduction type: /help intro
jshell> 0.1*0.1
$1 ==> 0.010000000000000002
你会期望上面的答案只有0.01;但是,情况并非如此。单元格。getNumericCellValue()获取存储的精确数值单元格值。但是
Excel
总是只使用15位有效数字作为数值。因此,对于Excel
,精确值0.14200000000000002
(有17个有效数字)将为0.142
如果需要以字符串形式获取所有单元格值,则不应通过CellType
获取单元格值。相反,您应该使用apachepoi
。DataFormatter.formatCellValue
方法通过将所有单元格值格式化为与Excel
相同的字符串来获取所有单元格值。因此,如果Excel
显示0.142
作为单元格值,那么DataFormatter
也将获得0.142
,即使精确的数值单元格值为0.14200000000000002
例如:
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
import java.util.Locale;
class GetDataFromExcelUsingDataFormatter {
public static void main(String[] args) throws Exception {
Workbook workbook = WorkbookFactory.create(new FileInputStream("ExcelExample.xlsx"));
DataFormatter dataFormatter = new DataFormatter();
FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
String cellValue = dataFormatter.formatCellValue(cell, formulaEvaluator);
System.out.println(cellValue);
}
}
workbook.close();
}
}
Cell.getNumericCellValue()。但是Excel
总是只使用15位有效数字作为数值。因此,对于Excel
,精确值0.14200000000000002
(有17个有效数字)将为0.142
如果需要以字符串形式获取所有单元格值,则不应通过CellType
获取单元格值。相反,您应该使用apachepoi
。DataFormatter.formatCellValue
方法通过将所有单元格值格式化为与Excel
相同的字符串来获取所有单元格值。因此,如果Excel
显示0.142
作为单元格值,那么DataFormatter
也将获得0.142
,即使精确的数值单元格值为0.14200000000000002
例如:
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
import java.util.Locale;
class GetDataFromExcelUsingDataFormatter {
public static void main(String[] args) throws Exception {
Workbook workbook = WorkbookFactory.create(new FileInputStream("ExcelExample.xlsx"));
DataFormatter dataFormatter = new DataFormatter();
FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
String cellValue = dataFormatter.formatCellValue(cell, formulaEvaluator);
System.out.println(cellValue);
}
}
workbook.close();
}
}
看看Apachepoi上的帖子,请编辑您的问题,使其包含代码,而不是图像链接。使用代码格式,以便问题中的所有内容都易于阅读。请查看ApachePoi上的帖子。请编辑您的问题以包含代码,而不是图像链接。使用代码格式,以便问题中的所有内容都易于阅读。