Shell脚本(7)——高精度计算(公式里超长数字计算)
创作者俱乐部成员
问题是这样的: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命令计算文本,获得结果
@WPS产品体验官
创作者俱乐部成员
@WPS产品体验官
创作者俱乐部成员
创作者俱乐部成员
创作者俱乐部成员