记一个Excel中的大整数精度丢失问题

=Start=

缘由:

最近在做数据分析的过程中碰到一个比较诡异的问题,之前以为是数据平台的引擎导致的,后来没想到是Excel在处理超大数值的整数时自身的精度丢失导致的,一般还真的很难遇到这种场景(对应字段需要是bigint类型的超过15位的整数,导出格式为Excel,然后最后几位还不能是0,最后你还要拿原始数据进行查找验证,几个条件组合在一起才会发现)。

在此记录一下这个问题,同时通过一个简单的样例进行验证,方便大家理解,同时也给出一个简单的解决方案进行规避。

正文:

参考解答:

先说结论:

  • 在Excel中录入的数字超过11位,默认就会以科学记数法的形式显示。
  • 大于15位的数字后面全部变为0。

解决办法:

  • 导出的时候将对应列的类型转换成string类型。
  • 或者导出为csv或txt的文本格式。

// 测试验证SQL
SELECT
1012345678 as d10,
11123456789 as d11,
121234567891 as d12,
1312345678912 as d13,
14123456789123 as d14,
151234567891234 as d15,
1612345678912345 as d16,
16123456789123456 as d17,
161234567891234567 as d18,
cast(161234567891234567 as string) as s18
;

在大数据平台上执行之后,导出为Excel格式之后打开(Excel中当数字的长度超过11的时候默认就科学记数法显示了,注意A列和B列还有后面几列的区别):

移动光标的位置到G2之后,你会发现d16的值变成了(还是上图):
1612345678912340
而不是:
1612345678912345
最后一位的5变成了0。

对于18位长度的数字,后面4位的精度就已经丢失了(本该是4567,结果是5000):

刚开始以为只是显示的问题,后来发现不是(选中特定列,然后「右键」、「设置单元格格式…」、「数值」然后设置「小数位数」为0,但精度还是丢失的):

参考链接:

解决Excel或者CSV数值精度缺失问题(科学记算法精度缺失问题)
https://blog.csdn.net/weixin_42425365/article/details/111059168

可否不以科学记数法的方式表示大于99999999999的数值?

怎么让excel不转换为科学计数法?
https://www.zhihu.com/question/20096750

Excel粘贴长文本数字 精度丢失
https://blog.csdn.net/zirufeng/article/details/54891651

python csv文件使用excel打开数字丢失精度
https://blog.csdn.net/leaves_story/article/details/102743622

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/5100.html

《记一个Excel中的大整数精度丢失问题》上的一个想法

  1. 解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG
    https://blog.csdn.net/oyi319/article/details/6406506
    `
    直接用Excel 2007打开UTF-8编码的CSV文件会导致汉字部分出现乱码。

    原因是Excel 2007以ANSI格式打开,不会做编码识别。

    打开UTF-8编码的CSV方法:
    1) 打开Excel 2007
    2) 执行“数据”->“自文本”
    3) 选择CSV文件,出现文本导入向导
    4) 选择“分隔符号”,下一步
    5) 勾选“逗号”,去掉“Tab 键”,下一步,完成
    6)在“导入数据”对话框里,直接点确定

    ==

    另外一种方法,将UTF-8文件转换为ANSI(936)或国标码。
    `

    解决csv文件打开是乱码的问题
    https://blog.csdn.net/qq_39135609/article/details/88535543

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注