盘点Excel中的那些有趣的“bug”
本文由葡萄城技术团队原创并首发
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。
Excel 1.0早在1985年正式进入市场,距今已经有36年了,虽然在推出时市面上已经有了类似软件Lotus 1-2-3,但Excel仍然凭借着其对竞品在功能上的全面超越,再加之和Windows环境的直接捆绑,直接将Excel推向了电子表格办公软件的王者的地位。
但在今天这篇文章里,我们不是为了讲Excel中那些大家已经耳熟能详的功能,让我们一起来看看,即便强大如Excel也会有的一些令人费解的计算结果吧!
1900年2月29日
小学生都知道在我们现在使用的公历(格里高利历)中规定:年份是4的倍数,且不是100的倍数的,为闰年;年份为100的倍数,必须是400的倍数才是闰年。
那么1900年并不满足上述条件不是闰年,但是在Excel中却存在1900年2月29日这天,通过拖拽填充的方式,可以看到2月28日之后是29日。是因为Excel还在使用4年一润的儒略历吗?经过测试在Excel中并不存在2100年2月29日,那为什么只有1900年这一天错了?
Excel官方给出过回复,这是Excel前身Lotus 1-2-3的一个bug,但是修复问题会导致历史文件出现一天的误差,出于对老文件的兼容,同时这个Bug影响很小,Excel并未修复这个bug,1900年2月29日保留至今 。
38/12/31是1938还是2038
进入21世纪一个百年轮回开始,日常中我们习惯只说年份的两位例如1987年简称87年,2002年简称02年。在Excel中也支持2位年份的输入,例如输入87/12/31,自动识别为1987/1231;输入20/12/31自动识别为,2020/12/31。可是在输入30/12/31却又变会1930年了,Excel按照什么规则判断年份呢?
在这里Excel有一个2029规则,记输入00-29中的数字会自动识别为21世纪,其余则是20世纪,如果想输入29年之后的年份,就需要输入四位数字了。当然也可以通过修改操作系统设置来改变2029这个节点,具体可参考Excel的官方说明: https://docs.microsoft.com/zh-cn/office/troubleshoot/excel/two-digit-year-numbers 。
两数不相等
在Excel中输入=1.2-1.1=0.1,回车后计算结果为FALSE,这说明1.2减1.1的结果不是0.1,是Excel算错了吗?可是输入=1.2-1.1确实显示0.1啊。
这的确是Excel算错了,但是这个并不是Excel特有的错误,而是计算机2进制特性导致的浮点数计算精读误差问题。简而言之,计算机计算过程使用二进制,对于1.2-1.1的结果为2进制循环小数,在存储时会进行小数截断,导致出现误差。
如果在Excel中设置显示位数20位就会发现实际计算值为0.09999999999999990000。
通常对于误差较小的结果,Excel可以自行修正,但是向1.2-1.1的结果Excel却没有处理。
因此,在进行数值比较的时候使用ROUND是一个好习惯,可以根据业务场景涉及到的小数范围设置参数。例如:=ROUND(1.2-1.1, 10)=0.1。
四舍五没入
在上述例子中使用的ROUND函数规则是四舍五入,但是同样因为精度问题造成了一些计算问题 。例如=ROUND((8.92-8.71)/6,2) ,结果是0.03。期待值是0.4,由于误差计算结果并未达到0.35,并没有五入。
由于计算误差想要得到一个四舍五入的2为小数,需要进行2次ROUND,首先修正误差,然后再四舍五入保留2位小数。对于所有操作计算都做两次ROUND过于繁琐,这里可以使用Excel提供的另一个设置,使用“显示精度”,这样Excel在存储计算时,会按照单元格设置的显示小数位数来保留精度。
- 在 "文件" 菜单上,单击 "选项",然后单击 "高级" 类别。
- 在 "计算此工作簿时" 部分,选择所需的工作簿,然后选中 " 将精度设定为显示" 复选框。
但是要注意,后续计算需要真实的计算结果还是格式化后的结果,不正确的使用这个功能可能会导致误差越来越大。
数字不计算
如截图,单元格中对SUM结果为0,同时单元格左上角有绿色三角提示“以文本形式存储的数字“。这个提示就是SUM结果为0的原因,这些数字实际存储格式为文本,而文本并不参加数字的运算。
这里有个概念是存储格式,当在Excel单元格中输入数字0,Excel默认会以数字格式作为存储,也就是前面说的2进制,但是如果先设置这个单元格类型为文本,则0当作文本。在Excel中数字和日期默认靠右显示,文本靠左。
这也是我们经常在输入电话号码和身份证号是存在的问题,输入身份证号后,显示成了科学计数法,这里就需要先设置单元格为文本再输入。
总结
Excel中有很多这样并不是很符合日常行为的操作,以上只是葡萄城在研究Excel电子表格时遇到的其中一部分有趣的内容,相信大家也遇到过什么比较奇妙的计算错误,欢迎留言吐槽。
盘点Excel中的那些有趣的“bug”的更多相关文章
- Java利用POI导入导出Excel中的数据
首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...
- java的poi技术下载Excel模板上传Excel读取Excel中内容(SSM框架)
使用到的jar包 JSP: client.jsp <%@ page language="java" contentType="text/html; charset= ...
- Python读取excel中的图片
作为Java程序员,Java自然是最主要的编程语言.但是Java适合完成大型项目,对于平时工作中小的工作任务,需要快速完成,易于修改和调试,使用Java显得很繁琐,需要进行类的设计,打成jar包,出现 ...
- Excel中如何将时间戳转为时间?
Unix时间戳转换Excel时间? Excel中如何将时间戳转为时间? Excel默认不支持Unix格式时间戳,这在导入数据时十分不便.可以用以下公式将时间戳转换成Excel格式的时间: =(x+8* ...
- salesforce零基础学习(一百一十五)记一个有趣的bug
本篇参考:https://help.salesforce.com/s/articleView?language=en_US&type=1&id=000319486 page layou ...
- Java实现Excel中的NORMSDIST函数和NORMSINV函数
由于工作中需要将Excel中的此两种函数转换成java函数,从而计算内部评级的资本占用率和资本占用金额.经过多方查阅资料和整理,总结出如下两个转换方法 标准正态分布累计函数NORMSDIST: pub ...
- C# 获取Excel中的合并单元格
C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...
- Open Xml 读取Excel中的图片
在我的一个项目中,需要分析客户提供的Excel, 读出其中的图片信息(显示在Excel的第几行,第几列,以及图片本身). 网络上有许多使用Open Xml插入图片到Word,Excel的文章, 但 ...
- NOPI读取模板导出(Excel中追加数据)
在Controller里,我们定义一个FileResult的Action,返回值是一个文件形式被浏览器下载下来. [HttpGet] public FileResult ExportProductLi ...
随机推荐
- hdu-6699 Block Breaker
题意: 就是给你一个n行m列的矩形,后面将会有q次操作,每次操作会输入x,y表示要击碎第x行第y列的石块,当击碎它之后还去判断一下周围石块是否牢固 如果一个石块的左右两边至少一个已经被击碎且上下也至少 ...
- Codeforces Round #645 (Div. 2) D. The Best Vacation (贪心,二分)
题意:一年有\(n\)个月,每月有\(d_{i}\)天,找出连续的\(x\)天,使得这\(x\)天的日期总和最大,任意一年都能选. 题解:首先要先贪心,得到:连续的\(x\)天的最后一天一定是某个月的 ...
- CQRS Event Sourcing介绍
什么是CQRS模式? CQRS是Command and Query Responsibility Segregation的缩写,直译就是命令与查询责任分离的意思. 命令会改变对象的状态,但不返回任何数 ...
- JVM调优参数、方法、工具以及案例总结
这种文章挺难写的,一是JVM参数巨多,二是内容枯燥乏味,但是想理解JVM调优又是没法避开的环节,本文主要用来总结梳理便于以后翻阅,主要围绕四个大的方面展开,分别是JVM调优参数.JVM调优方法(流程) ...
- CF1401-C. Mere Array
CF1401-C. Mere Array 题意: 给出一个长度为\(n\)的数组\(a\),你可以对这个数组进行如下操作:对于数组\(a\)中任意的两个元素\(a_i\).\(a_j\),若\(gcd ...
- js code review
js code review https://codereview.stackexchange.com/ refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只 ...
- ReactDOM API All In One
ReactDOM API All In One React DOM API render() hydrate() unmountComponentAtNode() findDOMNode() crea ...
- window.navigator All In One
window.navigator All In One navigator "use strict"; /** * * @author xgqfrms * @license MIT ...
- SwiftUI All In One
SwiftUI All In One SwiftUI SwiftUI is an innovative, exceptionally simple way to build user interfac ...
- 使用 js 实现一个简易版的 vue 框架
使用 js 实现一个简易版的 vue 框架 具有挑战性的前端面试题 refs https://www.infoq.cn/article/0NUjpxGrqRX6Ss01BLLE xgqfrms 201 ...