一言难尽的Round

wils
wils

创作者俱乐部成员

先声明,无论WPS还是Excel,行为是一致的,所以无论你用哪个,都逃不掉一言难尽的Round,所以这里不是要提交什么bug,只是吐槽。。。

先看公式,比如这张图,A列F列是手写的数字,B列是1减A,C列G列是round公式,可以看到C列G列对于相同的数字,round的结果不同,而且是随机不同。。。

目前个人认为规律是,计算后的结果有浮点精度问题,即使是四舍五入(并非四舍六入五成双)也有舍入问题,且基本随机发生。。。

再来看宏,js宏和vba宏的表现差不多,奇怪而随机的结果,让人摸不着头脑。。。

不过就像vba里可以用decimal类型的数字精确的舍入,完全避免这个问题

js宏里可以用big.js之类的库,来实现精确的小数(注意不是浮点数)计算

如图:

vba或jsa里,用了专门的decimal库之后,round的结果终于是完全可预测的了

怎么说呢,大家用round解决一些匹配问题似乎已是常态,会计查账少1分钱也是常态,其中因为round导致的错误随机且不知道常见不常见。。。

如果你需要精确的round结果,貌似只有decimal库可以解决问题,但大家日常都在用随机的版本,你不合群就是你的错,也不知道该用不该用了。。。

海南省
浏览 407
1
10
分享
10 +1
13
1 +1
全部评论 13
 
云集店主小营路
云集店主小营路

创作者俱乐部成员

打卡
· 山西省
回复
 
懒得批爆
懒得批爆

创作者俱乐部成员

关于R浮点运算的精度,有一些看法,详情请查看https://bbs.wps.cn/topic/31996?chan=share&fromshare=copylink
· 四川省
1
回复
 
哈哈
只用到浅表层,没想到还有这一层
· 贵州省
1
回复
 
Boyuan
此处不便展开,特在此贴中回复 https://bbs.wps.cn/topic/31979
· 河南省
1
回复
wils
wils

创作者俱乐部成员

确实是这个问题,而且无论python、js、vba都是这样,而且这些语言里都有decimal类(十进制小数而非浮点数)来解决这个问题
· 海南省
回复
 
wps新路
wps新路

WPS函数专家

针对出现数组溢出问题 我一般是先用roundup进上来一位后再处理一般出问题感觉是尾部类似9999......那种情况
· 重庆
1
回复
wils
wils

创作者俱乐部成员

999结尾的用round没问题
· 海南省
回复
 
那谁谁ృ༊゜
打卡
· 广东省
1
回复
 
清华学弟任泽岩
清华学弟任泽岩

创作者俱乐部成员

专业了。。。我是round roundup rounddown int mod灵活切换 浅尝辄止
· 辽宁省
1
回复
 
懒得批爆
懒得批爆

创作者俱乐部成员

这个问题要探讨先,先收藏一个
· 四川省
1
回复
 
青衫洗旧
打卡
· 陕西省
1
回复