离奇问题:java通过poi读取excel单元格的小数时会出错

2024-06-11 16:44

本文主要是介绍离奇问题:java通过poi读取excel单元格的小数时会出错,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题

java通过poi读取excel单元格的小数时会出错,分析后发现是因为会损失精度。

处理的代码

/*** DataFormatter 直接new就行:DataFormatter df = new DataFormatter();*/
private String getNumericCellValue(Cell cell, DataFormatter df) {String valueStr = df.formatCellValue(cell);// 格式化后的数字,比如会保留后面的0if (StringUtils.isNotBlank(valueStr)) {CellStyle cellStyle = cell.getCellStyle();if (cellStyle != null) {String formatString = cellStyle.getDataFormatString();if ("General".equals(formatString)) {// 常规,则直接返回格式化后的值return valueStr;} else {// 如果不是常规,比较准确数字和格式化后的数字小数位数是否一致String valueString = String.valueOf(cell.getNumericCellValue());// 准确的数字if (!valueString.endsWith("0")) {// 如果不是以0结尾,就获取字符串,否则可能不准确cell.setCellType(Cell.CELL_TYPE_STRING);String valueStringStr = cell.getStringCellValue();// 准确的数字字符串if (!valueString.equals(valueStringStr)) {logger.warn("数字与字符串不一致:" + valueString + "," + valueStringStr);valueString = valueStringStr;}}int pointNumString = MathUtil.getDecimalPlace(valueString);// 准确数字的小数位数int pointNumStr = MathUtil.getDecimalPlace(valueStr);// 格式化后数字的小数位数// 如果一致,或者格式化后的数字小数位数比准确数字多,则直接返回格式化后的值if (pointNumString <= pointNumStr) {return valueStr;} else {// 否则设置保留的小数位数return new BigDecimal(valueString).setScale(pointNumStr, BigDecimal.ROUND_HALF_UP).toPlainString();}}}}return valueStr;}

这篇关于离奇问题:java通过poi读取excel单元格的小数时会出错的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1051724

相关文章

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Java Lambda表达式的使用详解

《JavaLambda表达式的使用详解》:本文主要介绍JavaLambda表达式的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言二、Lambda表达式概述1. 什么是Lambda表达式?三、Lambda表达式的语法规则1. 无参数的Lambda表

java中Optional的核心用法和最佳实践

《java中Optional的核心用法和最佳实践》Java8中Optional用于处理可能为null的值,减少空指针异常,:本文主要介绍java中Optional核心用法和最佳实践的相关资料,文中... 目录前言1. 创建 Optional 对象1.1 常规创建方式2. 访问 Optional 中的值2.1

Spring Boot 整合 Apache Flink 的详细过程

《SpringBoot整合ApacheFlink的详细过程》ApacheFlink是一个高性能的分布式流处理框架,而SpringBoot提供了快速构建企业级应用的能力,下面给大家介绍Spri... 目录Spring Boot 整合 Apache Flink 教程一、背景与目标二、环境准备三、创建项目 & 添

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

Spring @RequestMapping 注解及使用技巧详解

《Spring@RequestMapping注解及使用技巧详解》@RequestMapping是SpringMVC中定义请求映射规则的核心注解,用于将HTTP请求映射到Controller处理方法... 目录一、核心作用二、关键参数说明三、快捷组合注解四、动态路径参数(@PathVariable)五、匹配请