【问题标题】:How to get actual value from CSV file instead exponential value如何从 CSV 文件中获取实际值而不是指数值
【发布时间】:2014-04-13 15:41:20
【问题描述】:

我面临指数值的问题(例如:1.4588E+12)。根据我的要求,我需要从具有指数值的 CSV 文件中读取数据。我需要有精确的值而不是指数。在我的应用程序中,我正在获取 Microsoft Excel 文件,当我更新超过 15 位的数字等数据并将此值保存为 .csv 文件时,该值保存为 1.4588E+12 而不是 1458795648552。要读取此 CSV 文件,我正在使用打开csv.jar。读取 CSV 文件时有什么方法可以获取实际值?

提前致谢。

【问题讨论】:

    标签: csv


    【解决方案1】:

    有几个问题:

    1. Excel 使用double precision floating point 来表示数字。这种格式的有效位有 52 个显式位加上 1 个隐含位,总共 53 个位,这几乎足以表示任何 16 个十进制数字,但不是全部(53 log10(2) ≈ 15.955)。因此请注意,并非所有 16 位十进制数字在 Excel 中都保持完全精度。
    2. 当您从 Excel 导出格式为数字(而不是文本)的 CSV 数字时,Excel 将为大数字选择科学记数法,并且您可能会丢失精度,因为并非所有有效数字都被写出,当发生这种情况时,读取 CSV 文件以恢复丢失的数字时,您无能为力。在另存为 CSV 之前,您应该使用这些数字将列格式化为文本。
    3. 假设您有一个 16 位十进制数字,它可以用双精度浮点数表示,并且您将其保存为文本...您在将数字存储为时没有丢失精度CSV。但是,当 Excel 从 CSV(我不了解 opencsv.jar)导入时,Excel 只会获取您号码的前 15 位数字,任何其他数字都设置为零。

    解决此问题的一种方法是在 Excel 中再添加两列,其中一列表示除以 1E8(高 8 位小数)的数字,另一列表示以 1E8 为模的数字(低 8 位小数)柱子。然后,您将第一列乘以 1E8,并在读取 CSV 文件后添加第二列以恢复原始数字。

    这是一个示例,使用 Google 文档,但在 Excel 中应该类似:

    这些是我用来将 A1 中的数字拆分为 B1 和 C1 然后在 D1 中再次加入的公式

    这是值的样子,注意单元格 D1 在单元格 A1 中具有重构值

    您也许可以隐藏列 B 和 C,但仍将它们导出到 CSV。这样填写电子表格的人就不会知道 A 列中的数字正在 B 列和 C 列中被操纵。你不需要 D 列,我把它放在那里只是为了你可以看到 A 列中的数字可以从 B 列和 C 列的值中恢复。

    【讨论】:

    • 但在将 Excel 数据保存为 csv 之前,我没有更改其格式的空间。是否有任何 API 支持自动执行此操作。
    • @vaitla 不确定您的意思,您无权访问 Excel 电子表格,或者您想了解有关如何进行更改的更多详细信息?我没有 Excel,但我可以在 Google 文档电子表格上向您展示如何进行等效更改。
    • 是的,我正在获取 excel 数据。我有权更改 excel 文件(这将包含客户联系方式,如 PhNo 等)。我的应用程序需要 CSV 文件作为输入文件来读取这些联系方式进入应用程序。如果我将联系人编号从 10 位十进制数字更新为 15 位数字,它将转换为科学格式。我可以在 excel 中更改此格式,但不建议手动进行,因为最终用户可能不知道这些手动更改。是否有任何数学过程可以将科学格式恢复为十进制格式?如果这个 psbl 我可以在从 CSV 读取它的同时在 java 代码中执行它。
    • 好吧,问题是,使用您的示例,如果 CSV 文件包含“1.4588E+12”,那么您只有 5 位精度为“1.4588”的十进制数字,您丢失了“ 1458795648552”,并且 Excel 已将“7”四舍五入为“8”...因此信息已丢失,如果 CSV 不存在“95648552”,则无法恢复。
    • 所以解决方案是确保 CSV 包含所有数字,或者在同一列中(通过将数字存储为文本)或通过添加另外 2 列,其中一列带有一个抓住上部的公式8 个小数位和另一个抓取低 8 个小数位的数字……阅读 CSV 后将其拼凑起来。
    猜你喜欢
    • 2021-12-12
    • 2010-11-09
    • 2022-11-17
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多