Shell脚本(7)——高精度计算(公式里超长数字计算)

wils

创作者俱乐部成员

问题是这样的:wps表格里的18位数字,公式计算后怎么不变成科学计数法,且保留所有精度?

如图,直接计算会丢失精度

由于JS宏可以调用库,所以去npm/github上找到big.js库(不让发链接),直接复制js的内容,粘贴到JS宏的一个模块里,然后在宏编辑器的工具、选项、编译里,关掉禁止全局的选项,就可以自定义高精度十进制(decimal)计算的公式了,如图:

A列是手写的30位数字字符串,B1是直接乘以8,变成了科学计数法

B2用的自定义公式,先把输入的数字x变成十进制(decimal)数,然后返回乘以8的结果,保留了全部精度,这种大数对象的其他操作可以查看big.js库的说明

说到这里,不得不提一嘴Shell命令里的计算器bc

看到黑框框的操作界面,不少人会抱怨真是原始,是的,真原始。。。

但这个原始的计算器有一些值得注意的特点:

由于Shell处理的就是文本,所以这里的数字天生就是字面的十进制文本,没有浮点数也就没有浮点误差,也没有表达数字位数的限制、也没有精度限制

虽然基本计算只有加减乘除、乘方开方、正弦余弦、反正切这些,但是,支持自定义类似c的函数,泰勒展开到scale指定的精度,就算自定义解方程,微积分函数也没问题

💡

先定义一个递归求阶乘的函数f,然后计算100的阶乘,得到一个158位数的精确结果

所以,这样一个天生无限精度、十进制计算、0.1+0.2就是等于0.3的,可编程计算器,相比起python、js、vba等几乎所有语言里都有浮点误差的环境,这个原始Shell工具是不是还挺有用的😁

最后,根据前文所说,JS宏里只需要构造个需要计算的文本,通过shell执行或通过fetch发请求,都可以通过bc命令计算文本,获得结果

海南省
浏览 853
收藏
6
分享
6 +1
10
+1
全部评论 10
 
懒得批爆

@WPS产品体验官

如果说Shell是这个命令提示符窗口,那么待JS宏上线Mac后,岂不是这一套在Mac上就不适用了,不如讲讲Linux上的处理方法。
· 四川省
回复
wils

创作者俱乐部成员

Shell这个在vba里用了很多年,vba里批量改名之类的,可以用shell执行一段批处理,vba里还有wscript.shell可以代替 wps里只有shell可以执行外部代码,这里是用来开httpd服务,方便之后用fetch访问的,因为没有com对象,无可代替 linux里的shell比批处理强得多,shell+fetch是最近几个月才添加到linux专业版wps里去的,几乎是linux里JS宏唯一的和外部数据交互的方法,还不稳定,论坛里一直在抱怨get命令啥都取不到 win和linux在这方面,运行的shell命令是互相通用的,win里需要个busybox,然后在bat的开头加一句注释就可以运行,linux里啥都不需要,直接运行同样的sh脚本,还是很爽的 mac应该是不支持的。。。 好像有一些bsd命令可用,但一方面几十年都没更新这些命令,功能缺少很多,另一方面mac好像系统不支持这么调用外部,大概就是mac和程序员互相看不顺眼那种感觉,要不是为了mac用户肯掏钱。。。
· 广东省
回复
 
懒得批爆

@WPS产品体验官

认真看完,没看懂全文的主题是什么,是介绍WPS的哪个功能,还是介绍GitHub,Shell是WPS的功能吗,在哪个位置,没找到哩?
· 四川省
1
回复
wils

创作者俱乐部成员

前半部分是介绍JS宏里可以使用npm里的big.js库进行保持精度的计算 后半部分是介绍JS宏也可以使用Shell里的bc命令进行高精度计算 确实想到啥写啥,有点太凌乱 之前发过的内容也不该再发一遍所以说的可能太简略。。。我想想怎么改一下
· 海南省
回复
 
学习了
· 山东省
1
回复
 
方盛

创作者俱乐部成员

每个字我都认识,放在一起,我就不认识了
· 湖北省
1
回复
 
清华学弟任泽岩

创作者俱乐部成员

专业
· 辽宁省
1
回复