网站开发公司怎么查,网站建设公司做前端,做网站上传图片一直错误,电脑版qq一、前言
与其他语言不同#xff0c;在JS中不区分整数与浮点数#xff0c;统一为浮点数。所有数字类型统一都是基于 IEEE 754 标准来实现#xff1b;采用的是“双精度”格式#xff08;即 64 位二进制#xff09;。这也意味着在小数计算时#xff0c;会发生精度误差的情…一、前言
与其他语言不同在JS中不区分整数与浮点数统一为浮点数。所有数字类型统一都是基于 IEEE 754 标准来实现采用的是“双精度”格式即 64 位二进制。这也意味着在小数计算时会发生精度误差的情况这并不是js独有的其他基于IEEE 754标准的都会有这样的问题。
二、属性方法
2.1 定义数字类型
JS中的数字常量一般用十进制表示。例如
const a 42;
const b 42.3;数字前后的 0 可以省略不建议请规范写法
const a 0.42;
const b .42;
const c 42.0;
const d 42.;数字常量还可以用其他格式来表示八进制和十六进制如果前缀为 0则 JavaScript 会把数值常量解释为八进制数如果前缀为 0 和 “x”则解释为十六进制数。例如
const a 070;
const b 0xFF;2.2 特殊的数值
2.2.1 最大值Number.MAX_SAFE_INTEGER
最大整数是 2^53 - 1即 9007199254740991在 ES6 中被定义为Number.MAX_SAFE_INTEGER。
2.2.2 最小值Number.MIN_SAFE_INTEGER
最小整数是 -9007199254740991在 ES6 中被定义为 Number.MIN_SAFE_INTEGER。
2.2.3 无穷数
在进行运算时可能都遇到过编译错误或者运行时错误例如“除以 0”。这个时候不会得到无穷数正无穷InfinityNumber.POSITIVE_INFINITY与负无穷-InfinityNumber.NEGATIVE_INFINITY。
2.2.4 不是数字的数字NaN
如果数学运算的操作数不是数字类型或者无法解析为常规的十进制或十六进制数字就无法返回一个有效的数字这种情况下返回值为 NaN。可以通过Number.isNaN(值)判断。
const a 2 / 测试; // NaN
a NaN; // false
a NaN; // false
Number.isNaN(a); // true注意在运算的时候要注意避免得到NaN防止程序出现错误
2.2.5 零值
JavaScript 有一个常规的 0也叫作0和一个 -0。-0 除了可以用作常量以外也可以是某些数学运算的返回值。
const a 0 / -2; // -0
const b 0 * -2; // -0
// 但是规范定义的返回结果是这样
a.toString(); // 0
a ; // 0
String( a ); // 0
// 但是-0字符串翻过来就是对的
-0; // -0
Number( -0 ); // -0
JSON.parse( -0 ); // -0
// 0与-0比较都为true
-0 0; // true
-0 0; // true注意需要注意正负0的比较使用-0场景例如动画帧的移动速度等。
2.3 数字的方法
toSting以字符串返回数值toFixed返回字符串值它包含了指定位数小数的数字会四舍五入toPrecision: 返回字符串值它包含了指定长度的数字
const a 22;
a.toString(); // 22
a.toFixed(3); // 22.000
const b 2.222;
b.toPrecision(2); // 2.2
b.toPrecision(3); // 2.222.4 变量转换为数字
Number将变量转换为数字parseInt返回数字的整数部分parseFloat返回一个浮点数
Number(22.2); // 22.2
parseInt(22.2); // 22
parseFloat(22.2); // 22.2
Number(测试); // NaN
parseInt(测试); // NaN
parseFloat(测试); // NaN注意上述三个方法转换时如果转换失败会返回NaN开发中要注意避免。
三、实战示例
3.1 浮点数计算出现精度缺失
3.1.1 发现问题
在日常项目中会遇到小数之间的算术运算例如商品价格的计算、账户金额的统计涉及的小数时有时候会出现精度误差计算结果不准确导致客户反馈bug。
示例
console.log(0.1 0.2); // 0.300000000000000043.1.2 问题原因
我们在上面有介绍过在JS中所有数字都是以IEEE-754标准格式64位浮点数形式储存1与1.0是相同的。因为有些小数以二进制表示位数是无穷的。JavaScript会把超出53位之后的二进制舍弃。所以并不是JS中才会出现所有基于IEEE-754标准的浮点数计算都会有这样的问题。
3.1.3 解决方案
使用第三方类库
如果在项目中多处都需要使用浮点数计算这个时候就需要考虑引用第三方类库方法来进行小数点之间的计算。这里推荐第三方类库
Math.jsdecimal.jsbig.js
简易封装
如果只是单纯处理个别计算问题时可以使用下面简易封装的简易加法运算。核心思路就是计算小数点后最大有几位转换成10的指数幂进行计算最后还原。
/*** 精度相加*/
const addTogether (n1, n2) {let res1 n1.toString().split(.)[1]? n1.toString().split(.)[1].length: n1.toString().split(.)[0].length;let res2 n2.toString().split(.)[1]? n2.toString().split(.)[1].length: n2.toString().split(.)[0].length;let pow Math.max(res1, res2);let base Math.pow(10, pow);return (n1 * base n2 * base) / base;
};3.2 计算出现NaN
3.2.1 发现问题
在项目中设计到表单输入时有时候会进行两个变量之间的计算有时候展示结果会出现NaN的情况。
3.2.2 问题原因
在进行算术运算时会将变量类型隐式转换为数字类型如果转换原类型不是字符串的数字时无法转换为数字就会返回NaN。
3.2.3 解决方案
涉及到表单问题时要设置输入框为number类型在计算之前需要提前转换为Number类型如果转换为NAN要及时报错或者根据业务需求兼容处理。
const num 测试;
const curNum Number.isNaN(Number(num)) ? 0 : Number(num);