js自带的数学计算的方法

默认加减乘除符号: +、-、*、/
NaN与任意操作数加减乘除,结果都是NaN

加法

数字与字符串相加会拼接成字符串

//特殊操作数的求和(n代表任意数字)
//NaN与任意操作数相加,结果都是NaN
console.log(NaN + n);
//Infinity.与任意操作数相加,结果都是Infinity
//无限。与任意操作数相加,结果都是无限
console.log(Infinity + n);  //(infinity+n);
//Infinity与Infinity相加,结果是Infinity
//无限与无限相加,结果是无限
console.log(Infinity + Infinity);
//正负Infnity相加,结果是NaN
//正负相加,结果是Nan
console.log((-Infinity) + Infinity);
console.log(1 + 1) //输出2  
console.log(1 + "1") //输出11  

减法

在减法运算中,如果操作数为字符串,先尝试把它转换为数值,再进行运算。如果有一个操作数不是数字,则返回NaN。

//特殊操作数的运算和加法规则-致
console.log(2 - "1"); //返回1
console.log(2 - "a"); //返回NaN

使用值减去0,可以快速把值转换为数字。例如HTTP 请求中查询字符串一般都是字符串型数字,可以先把 这些参数值减去0转换为数值。这与调用parseFloat()方法的结果相同,但减法更高效、快捷。减法运算符 的隐性转换如果失败,则返回NaN,这与使用 parseFloat()方法执行转换时的返回值是不同的。

乘法

//特殊操作数规则和加法一致
//特殊操作数规则和加法一致
//0除一个非无穷大的数字,结果是Infinity
//0除一个非无穷大的数字,结果是无限
//或-Infinity,符号由第二个操作数的符号决定
//或-无限,符号由第二个操作数的符号决定
console.log(n / 0);
//返回-Infinity,解释同上
//返回-Infinity,解释同上
console.log(n / -0); //(n/-0);
console.log(1 * 1) //输出1
console.log(1 * 1) //输出1

除法

//特殊操作数规则和加法一致
//特殊操作数规则和加法一致
console.log(1 / 1) //输出1  

求余运算

求余运算也称模运算

console.log(3 % 2); //返回余数1
//返回余数0.000000000000003
//返回余数0.000000000000003
console.log(3.1 % 2.3);

取反运算

前面加个负号(-)

//特殊操作数的取反运算
console.log(-5); //返回-5。正常数值取负数
//返回-5。先转换字符串数字为数值类型.
console.log(-"5");
//返回NaN。无法完全匹配运算,返回NaN
console.log("a");
console.log(-Infinity); //返回-Infinity
console.log(-Infinity); //返回Infinity
console.log(-NaN); //返回NaN

递增和递减

递增++和递减-- 运算就是通过不断的加1或减1,然后把结果赋值给左侧操作数,以实现改变自身结果的一种简洁方法。

  • 前置递增(++n) :先递增,再赋值。
  • 前置递减(–n) :先递减,再赋值。
  • 后置递增(n++) :先赋值,再递增。
  • 后置递减(n–) :先赋值,再递减。

Number

在js中,数字都属于Number对象,所以相应的有 Number 的一些方法

parseFloat()

将字符串转换成浮点数,和全局方法parseFloat()作用相同

parselnt()

将字符串转换成整型数字,和全局方法parselnt()作用相同

isInteger()

判断Number对象是否为整数

isNaN()

判断Number对象是否为NaN类型(NaN: 表示非数字)

leta1 = 400;
console.log('====' + isNaN(a1))//输出: ====false
toFixed()

把Number对象转换为字符串,结果的小数点后有指定位数的数字,不够以0补全,超出的话保留前两位小数

leta1 = 4;
console.log(a1.toFixed(2)) //输出4.00

toPrecision()

把Number对象格式化为指定的长度,长度不够的话 加小数点以0补全,长度超出的话一般不使用。

leta1 = 4;
console.log(a1.toPrecision(2)) //输出4.0
leta1 = 400;
//输出: ====4.0e+2
console.logl('===' + a1.toPrecision(2))

Math对象

Math是JavaScript中的一个内置对象,其中提供了一些数学中常用的常量值和函数,用来实现一些数学中 常见计算,例如计算平均数、求绝对值、四舍五入等。调用Math对象中的属性和方法无需预先使用
new运算符来创建它,直接将Math作为对象调用即可

abs(x)

返回x的绝对值

leta1 = -20.5697;
console.log('====' + Math.abs(a1))
ceil(x)

对x进行向上取整,即返回大于x的最小整数

leta1 = 20.5697;
console.log('====' + Math.ceil(a1)) //输出: 21

floor(x)

对x进行向下取整,即返回小于x的最大整数

leta1 = 20.5697;
console.log('====' + Math.foor(a1)) //输出: 20

max([x, [y, .])

返回多个参数的最大值

leta1 = 20.5697;
leta2 = 12;
console.log('====' + Math.max(a1, a2))//输出20.5697

min([x, [y, …1])

返回多个参数的最小值

leta1 = 20.5697;
leta2 = 12;
console.log('====' + Math.min(a1, a2))//输出12

pow(x,y)

返回x的y次幂

console.log('===' + Math.pow(2, 3))//2的3次方输出: 8

random()

返回一个0到1之间的随机数

//输出: 0.5560061 832715133
console.log('====' + Math.random)

round(x)

返回x四舍五入后的整数,注意是整数,没有小数

leta1 = 20.5697;
console.log('===' + Math.round(a1)) //輸出21
let a2 = 20.4697;
console.log('====' + Math.round(a2)) //输出20

sign(x)

返回x的符号,即一个数是正数、负数还是0
正数返回: 1
负数返回: -1
0返回: 0

leta1 = 20.5697;
console.log('===' + Math.sign(a1)) //输出1

trunc(x)

返回x的整数部分

leta1 = 20.5697;
console.log("===" + Math.trunc(a1)) //输出20

常见场景使用总结

求百分率的时候

例如:每天需要完成8个小时,480分钟的工作时间, 求每时每刻的工作完成率问题,百分比后面保留两位小数(四舍五入)。 思路:工作时间除以总时间,再乘以10000,执行四舍五入的方法,再除以100,就是得到完成率了。

let total = 480; //总工作时长
let finish = 100; //已经工作时长
let rate = Math.round(finish / total * 10000) / 100; //工作完成率S
console.log('rate', rate + "%"); //输出: 20.83%
得到10、100、 1000之间的随机数的时候

思路:先生成1-0之间随机数,再乘以10/100/1000, 再取整数部分。

const random = Math.random();
let random10 = Math.trunc(random * 10)
let random100 = Math.trunc(random * 100)
let random1000 = Math.trunc(random * 1000)
//输出: random10 4
console.log(' random10', random10)
//输出: random10 48
console.log('random100', random100)
//输出: random10 481
console.log('random1000', random1000)

可以使用插件,也就是第三方api .

-般的计算:例如加减乘除、四舍五入、三角函数的,可以使用js自带的Math类里面的方法。js本身计算精度的问题:
console.log(0.1+0.7)
输出: 0.79999999999999,在涉及到金额计算的时候,可能会有一分钱这样的误差,所以这是也可以使用第三方api来实现加减乘除等计算。

math.js .

中文官方文档: https://www.mathjs.cn/
英文文档: https://mathjs.org/
[中文文档有些地方无法显示,英文文档较为详细]
在math.js中有三种计算方法:

  • 执行常规的函数调用,例如math.add(math.sqrt(4), 2).
  • 计算像这样的表达式math. evaluate('sqrt(4) +2)
  • 链接操作,例如math.chain(4).sqrt).add(2).

Math.js包含许多配置选项。这些选项可以应用于创建 的mathjs实例,例如:可以配置number的具体类型
(BigNumber’,或’Fraction’)

链式操作

Math.js通过将值包装到中来支持链接操作Chain。可以使用函数math.chain(value) (以前称为 math.select(value))创建链。

math.chain(3) //开始链式操作
    .add(4) //加法
    .subtract(2) //减法
    .done() // 5 //计算完成结束
扩展

使用该函数可以轻松地使用函数和变量来扩展该库 import。该import函数在mathjs实例上可用,可以使 用该create函数创建该实例。 math.js可以扩展自定义的一些函数或变量到math实例 中供自己使用。

表达式的编写

可以编写-个表达式,给表达式中的变量赋值然后进 行计算。使用场景:需要进行灵活计算的时候(例如 电站项目的开发场景)
一个简单的例子:编写-一个简单的函数表达式,然后. 调用这个表达式得到值。

const parser = math.parser() //创建解析器
parser.evaluate("f(x) = x- 5") //编写计算表达式
let a1 = parser.evaluate('f(2)') //计算表达式// -3
let a2 = parser.evaluate("f(6)") // 1
console.log('a1', a1)
console.log('a2', a2)

具体表达式的语法、使用见文档。
https://www.mathjs.cn/docs/expressions/syntax.html

数据类型

布尔型、数字、大数字(Bignumber) 、复数(Complex)、分数(Fraction) 、数组(Array) 、矩阵(Matrix)、Unit(单位)、 String

math中的常量

NaN:没有数字。NaN
pi, PI: pi是一个数学常数,它是圆的周长与其直径之 比。3.141592653589793
version:返回math.js的版本号。

//输出: version 7.0.1
console.log("version", math.version)
常用api

api函数文档: https://mathjs.org/docs/reference/functions.html

常见算术计算

加法: math.add (x, y)
减法: math.subtract (x,y)
乘法: math.multiply (x,y)
除法: math.divide (x, y)
取绝对值: math.abs (x)
计算x到y,的幂: math.pow (x, y)
四舍五入: math.round (x[, n]) 可以保留n位小数
还有其他的复杂函数的计算:例如:代数函数、按位 函数、集合函数、 概率函数、关系函数、设置函数、 统计函数。

decimal.js

js有精度问题,对于-些金额的计算就总是与偶莫名其 妙的问题,decimal.js是使用的二 进制来计算的,所以能解决js的精度问题。
中文文档: https://gitee.com/lixingwu/decimal.js_cn/blob/master/cn/index.html #复制对应 的html代码打开
官方文档: http://mikemcl.github.io/decimal.js/

使用方式

安装:下载对应js文件引入使用,或者使用npm安装 下载地址: https://github.com/MikeMc/decimal.js/
简单使用:

//加法
vara = 0.1;
varb = 0.2;
console.log('Decimal.js加法运算a+b=', new Decimal(a).add(new Decimal(b)).toNumber());

//减法
vara = 1.0;
varb = 0.7
console.log("Decimal.js减法运算a-b=", new Decimal(a).sub(new Decimal(b)).toNumber());

//乘法
vara = 1.01;
var b = 1.003;
console.log("Decimal.js乘法运算a*b=", new Decimal(a).mul(new Decimal(b)).toNumber());
//除法
vara = 0.029;
varb = 10;
console.log("Decimal.js除法运算a/b=", new Decimal(a).div(new Decimal(b)).toNumber());

相应的也有四舍五入、绝对值这些函数,详细见官方 文档。 简单demo:


<script src="https://cdn.bootcss.com/decimal.js/10.1.1/decimal.js"></script>
<script>
    //没有使用decimaljs
    //110.0000000000001
    console.log(1.1 * 100)
    // 0:30000000000000004
    console.log(0.1 + 0.2)
    console.log(2.05 * 1.89 * 1.74 * 10000)
    //使用使用decimal.js
    console.log(new Decimal(1.1)
            .mul(new Decimal(100))
            .toNumber() //110
    console.log(new Decimal(0.1)
            .plus(new Decimal(0.2))
            .toNumber() //0.3 ;
    console.log(new Decimal(2.05)
            .mul(new Decimal(1.89))
            .mul(new Decimal(1.74))
            .mul(new Decimal(10000))
            .toNumber()//67416.3
</script>
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐