找回密码
 立即注册

QQ登录

只需一步,快速开始

Richard.Huang SpreadJS 开发认证

超级版主

42

主题

3186

帖子

4930

积分

超级版主

Rank: 8Rank: 8

积分
4930

SpreadJS 认证SpreadJS 高级认证

Richard.Huang SpreadJS 开发认证
超级版主   /  发表于:2023-9-7 13:37  /   查看:1605  /  回复:0
本帖最后由 Richard.Huang 于 2024-2-1 10:50 编辑

背景:
用户在设置公式时发现同样的数据,同样的公式,但是最终计算结果不同
111648oj4ipjktjliij4ti.png398531493.png
我们从图中可以发现,A2和B2都是0,但是均和0.5进行比较后,D2和E2的结果是不同的,此时有细心的小伙伴发现,因为一个是文本类型的0一个是数字类型的0,文本类型的0在进行比较时会被更改为ASCII值然后然后再计算,'0'的ASCII值是48,48>0 结果当然是TRUE,因此比较结果不同很正常。没错,这是问题的本质,但是造成这个问题的操作却不是仅仅是因为格式设置的问题,例如我们下图中,都是文本格式,但是计算结果也还是不同:
image-20230906174208819.png619384154.png
这是为什么呢?

继续探讨:
实际上我们通过getValue去获取这两个单元格的值,我们发现是不同的,都是文本格式,但是value不同。大家肯定会说了,为啥呢,我明明都设置了文本格式了,为啥我的0还是数字0
image-20230906174933531.png904347534.png

我们需要明确一个知识,对于单元格的值分为我们可以查看的text()和它本身的值value(),咱们可以理解为昵称和真实姓名。造成上述两个文本单元格的value不同的原因是,我们为单元格赋值以及更改单元格格式的顺序不同,A2是先填入0,后设置文本格式,B2是先设置文本格式,后填入0。操作顺序的不同,咱们底层对于他的处理也是不同的。

深入讨论:
实际上Excel对于赋值的底层操作原则是对于数字和日期等特别的类型会做单独的处理,并且尽量不同破环用户设置的真实值的,因此,如果你先设置单元格格式,那么Excel会认为您接下来的赋值会是一个字符串,您将0填写进该单元格,Excel会将text()和value()都设置为字符串'0'

如果先赋值,您输入了0进去,Excel对于数字的处理原则让他优先认为输入的0是一个数字,然后您将该单元格设置为文本格式,Excel会本着尽量不破坏用户设置的真实值value的原则,而仅仅只会将text()改为字符串'0',value并不会更改,仍然是数字0.(昵称可以改,真实姓名不能改)

接下来到了比较大小的环节,公式的计算用的是value值(真实值)

于是乎,先改格式再赋值进行的计算为"'0'>0.5",计算引擎会自动将字符串视为ASCII值,即“48>0”,结果为TRUE
而先赋值再改格式进行的计算为“0>0.5”,前者本身就是数值,因此不会比较所谓的ASCII一说,结果就为FALSE。

上述都是对于Excel赋值和更改单元格格式的底层机制做了简要探讨来告诉大家计算差异的原因,而我们的SpreadJS产品也沿用了Excel的设计,因此计算结果跟Excel是保持一致的。
160116v51om17jxxj5op4x.png110003050.png

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部