本篇文章给大家谈谈js小数计算引起的精度误差问题,以及js小数计算引起的精度误差问题有哪些的知识点,同时本文还将给你拓展0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算
本篇文章给大家谈谈js小数计算引起的精度误差问题,以及js小数计算引起的精度误差问题有哪些的知识点,同时本文还将给你拓展0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题、008_浮点数误差问题、c++如何提高浮点数计算的精度?、int型的精度比float的精度高等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- js小数计算引起的精度误差问题(js小数计算引起的精度误差问题有哪些)
- 0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题
- 008_浮点数误差问题
- c++如何提高浮点数计算的精度?
- int型的精度比float的精度高
js小数计算引起的精度误差问题(js小数计算引起的精度误差问题有哪些)
我记得刚开始学js的时候学到浮点有举例0.1+0.2 它的计算结果是:
0.1+0.2
0.30000000000000004
很神奇的一个计算,js是弱语言,在精度上没做处理;
我就自己定义了加减乘除:
加:
0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题
先看图
这个是JavaScript语言自身存在的一个问题。说道这里不得不提一下网上流传的JavaScript搞笑图
我们在使用云开发来开发微信小程序的时候,会经常遇到JavaScript小数计算精度失准的问题。特别是实现钱包计算的功能。虽然整数计算不会出错,但总不能要求微信小程序内都是整数计算吧,这不科学。
那么开发小程序涉及到小数计算的时候,如何防止小数计算精度失准。
其实有很多方法,这里主要推荐我觉得比较好的解决办法。就是使用math.js这个npm包来实现计算。
业务逻辑如下图
废话少说,直接上代码!!!
建一个calculation云函数,代码如下:
// 云函数入口文件
const cloud = require(''wx-server-sdk'')
const TcbRouter = require(''tcb-router''); //云函数路由
const math = require(''mathjs''); //云函数路由
cloud.init({
env:'''' //填入你的环境ID
})
// 云函数入口函数
exports.main = async (event, context) => {
const app = new TcbRouter({
event
});
//乘法
app.router(''multiply'', async(ctx) => {
var value = math.multiply(math.bignumber(event.num1), math.bignumber(event.num2))
ctx.body = math.round(value,2) //四舍五入,并且保留2位小数
});
//除法
app.router(''divide'', async(ctx) => {
var value = math.divide(math.bignumber(event.num1), math.bignumber(event.num2))
ctx.body = math.round(value,2) //四舍五入,并且保留2位小数
});
//加法
app.router(''sum'', async(ctx) => {
var value = math.add(math.bignumber(event.num1), math.bignumber(event.num2))
ctx.body = math.round(value,2) //四舍五入,并且保留2位小数
});
//减法
app.router(''subtract'', async(ctx) => {
var value = math.subtract(math.bignumber(event.num1), math.bignumber(event.num2))
ctx.body = math.round(value,2) //四舍五入,并且保留2位小数
});
return app.serve();
}
写完云函数的代码了,记得安装math.js计算库和tcb-router云函数路由的依赖包。
安装依赖包步骤,右击名为calculation云函数文件夹,再点击“在外部终端窗口中打开”,然后输入依次输入命令:npm install mathjs和npm install tcb-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”作为参数即可。
这里我们使用了云函数路由,这样我们可以把加减乘除的算法都合并到一个云函数里,节俭很多代码
end
欢迎关注微信公众号:小秃僧
008_浮点数误差问题
一、浮点数
a):float类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。
b):double表示这种类型的数值精度是float类型的两倍,又被称作双精度,绝大部分应用程序都采用double类型。
二、浮点数的表述范围
类型
占用存储空间
表数范围
float
4字节
-3.403E38~3.403E38
double
8字节
-1.798E308~1.798E308
三、在java中表示浮点数的两种表示形式
a):十进制形式 如:3.14 314.0 0.314
b):科学记数法形式 如: 314e-2 3.14e2 314E-3
四、测试浮点数代码:
public class TestFloadAndDoubleType {
public static void main(String[] args) {
/*
[X]因为浮点数默认是double类型、而float f=0.1中0.1默认是double类型的、
这样的话将一个8个字节的double类型转换为4个字节的float类型会出现编译错误
为了明确其类型我们在后面加f
*/
//float a=0.1;//[X]错误的
float b=0.1f;//[√]加f来明确其类型、正确的
//浮点数可以用科学计数法来表示
double c=314e-2;//3.14
double d=314e-3;//0.314
System.out.println("double c=314e-2中c的执行结果为: c="+c);
System.out.println("double d=314e-3中d的执行结果为: d="+d);
//浮点数的比较(注意:浮点数运算结果比较存在误差问题、所以不能精确比较)
double e=1.0/10; //0.1
System.out.println("浮点数运算结果误差示例:0.1f==1.0/10其比较结果为:"+(b==e));
float d1 = 423432423f;
float d2 = d1+1;
/**
* 二进制表示浮点数误差问题
*/
System.out.println("d1="+d1);
System.out.println("d2="+d2);
System.out.println("423432423f==423432423f+1的比较结果为: "+(d1==d2));//天呐尽然误差到相当?
}
}
测试结果为:
五、总结
a):浮点数的默认类型为double类型
b):浮点类型float, double的数据类型不适合在不允许有舍入误差的金融计算领域
c):由于浮点数占用存储空间有限,所以能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很多数字无法精确表示,其结果只能是接近,但不等于。
d):二进制浮点数不能精确的表示0.1,0.01,0.001这样10的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。
e):如果需要进行不产生舍入误差的精确数字计算大小数使用BigDecimal类、大整数BigInteger
注意:通过以上我们对浮点类型的了解、我们应该避免编程中使用浮点类型进行的运算结果的比较
c++如何提高浮点数计算的精度?
请教大侠们有没有好的解决方案?(另外想起,“神七”的项目中要提高相当的精度是怎么做到的呵呵~)
int型的精度比float的精度高
从精度上来说,int型比float的精度要高。
单精度浮点数虽然由32位组成,但是其中有1位符号位,8位指数,只有23位是数值尾数。也就是说它的精度仅为23位。
而整型int也由32位组成,它只有1位是符号位,剩下的31位都是数值尾数。
谁的精度高显而易见。
关于js小数计算引起的精度误差问题和js小数计算引起的精度误差问题有哪些的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题、008_浮点数误差问题、c++如何提高浮点数计算的精度?、int型的精度比float的精度高等相关知识的信息别忘了在本站进行查找喔。
本文标签: