当前位置: 首页 > 后端技术 > Node.js

0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度不准确的问题?

时间:2023-04-03 17:40:47 Node.js

先看图。这是JavaScript语言本身的问题。说到这里,就不得不提网上流传的搞笑JavaScript图片了。我们在使用云开发开发微信小程序时,经常会遇到JavaScript小数计算精度不准确的问题。尤其是实现钱包计算功能。虽然整数计算不会出错,但是我们不能要求微信小程序中的所有整数计算,这是不科学的。那么当小程序开发涉及到小数计算时,如何防止小数计算的精度不准确。其实方法有很多,这里主要推荐一下我认为比较好的方案。就是使用npm包math.js来实现计算。业务逻辑如下图所示,废话少说,直接上代码!!!创建计算云函数,代码如下://云函数入口文件constcloud=require('wx-server-sdk')constTcbRouter=require('tcb-router');//云函数路由constmath=require('mathjs');//云函数路由cloud.init({env:''//填写你的环境ID})//云函数入口函数exports.main=async(event,context)=>{constapp=newTcbRouter({event});//乘法app.router('multiply',async(ctx)=>{varvalue=math.multiply(math.bignumber(event.num1),math.bignumber(event.num2))ctx.body=math.round(value,2)//四舍五入并保留两位小数});//除法app.router('divide',async(ctx)=>{varvalue=math.divide(math.bignumber(event.num1),math.bignumber(event.num2))ctx.body=math.round(value,2)//四舍五入并保留两位小数});//加法app.router('sum',async(ctx)=>{varvalue=math.add(math.bignumber(event.num1),math.bignumber(event.num2))ctx.body=math.round(value,2)//四舍五入并保留两位小数});//减法app.router('subtract',async(ctx)=>{varvalue=math.subtract(math.bignumber(event.num1),math.bignumber(event.num2))ctx.body=math.round(value,2)//四舍五入保留2位小数});returnapp.serve();}写好云函数的代码后,记得安装math.js计算库和tcb-router云函数路由的依赖包安装依赖包步骤,右键云function文件夹名为calculation,然后点击“Openinanexternalterminalwindow”,然后依次输入命令:npminstallmathjs和npminstalltcb-router。安装成功后,点击“上传部署:云安装依赖(不要上传node_modules)”部署云功能。前端(小程序)请求代码如下:wx.cloud.callFunction({name:'calculation',data:{$url:"multiply",//云函数路由参数,示例参数为乘法num1:that.data.price,num2:that.data.rate,},success:res=>{console.log(res.result.value)//计算结果},fail(e){console.log(e)}});$url为填云函数的路由参数。上面的代码表示乘法。如果我们想让云函数计算加法,我们可以传入“add”作为参数。这里我们使用了云函数路由,这样我们就可以把加减乘除的算法合并到一个云函数中,这样可以节省很多代码。