js自带的数学计算的方法
默认加减乘除符号: +、-、*、/ NaN与任意操作数加减乘除,结果都是NaN
加法
数字与字符串相加会拼接成字符串
console.log(NaN + n);
console.log(Infinity + n);
console.log(Infinity + Infinity);
console.log((-Infinity) + Infinity);
console.log(1 + 1)
console.log(1 + "1")
减法
在减法运算中,如果操作数为字符串,先尝试把它转换为数值,再进行运算。如果有一个操作数不是数字,则返回NaN。
console.log(2 - "1");
console.log(2 - "a");
使用值减去0,可以快速把值转换为数字。例如HTTP 请求中查询字符串一般都是字符串型数字,可以先把 这些参数值减去0转换为数值。这与调用parseFloat()方法的结果相同,但减法更高效、快捷。减法运算符 的隐性转换如果失败,则返回NaN,这与使用 parseFloat()方法执行转换时的返回值是不同的。
乘法
console.log(n / 0);
console.log(n / -0);
console.log(1 * 1)
console.log(1 * 1)
除法
console.log(1 / 1)
求余运算
求余运算也称模运算
console.log(3 % 2);
console.log(3.1 % 2.3);
取反运算
前面加个负号(-)
console.log(-5);
console.log(-"5");
console.log("a");
console.log(-Infinity);
console.log(-Infinity);
console.log(-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))
toFixed()
把Number对象转换为字符串,结果的小数点后有指定位数的数字,不够以0补全,超出的话保留前两位小数
leta1 = 4;
console.log(a1.toFixed(2))
toPrecision()
把Number对象格式化为指定的长度,长度不够的话 加小数点以0补全,长度超出的话一般不使用。
leta1 = 4;
console.log(a1.toPrecision(2))
leta1 = 400;
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))
floor(x)
对x进行向下取整,即返回小于x的最大整数
leta1 = 20.5697;
console.log('====' + Math.foor(a1))
max([x, [y, .])
返回多个参数的最大值
leta1 = 20.5697;
leta2 = 12;
console.log('====' + Math.max(a1, a2))
min([x, [y, …1])
返回多个参数的最小值
leta1 = 20.5697;
leta2 = 12;
console.log('====' + Math.min(a1, a2))
pow(x,y)
返回x的y次幂
console.log('===' + Math.pow(2, 3))
random()
返回一个0到1之间的随机数
console.log('====' + Math.random)
round(x)
返回x四舍五入后的整数,注意是整数,没有小数
leta1 = 20.5697;
console.log('===' + Math.round(a1))
let a2 = 20.4697;
console.log('====' + Math.round(a2))
sign(x)
返回x的符号,即一个数是正数、负数还是0 正数返回: 1 负数返回: -1 0返回: 0
leta1 = 20.5697;
console.log('===' + Math.sign(a1))
trunc(x)
返回x的整数部分
leta1 = 20.5697;
console.log("===" + Math.trunc(a1))
常见场景使用总结
求百分率的时候
例如:每天需要完成8个小时,480分钟的工作时间, 求每时每刻的工作完成率问题,百分比后面保留两位小数(四舍五入)。 思路:工作时间除以总时间,再乘以10000,执行四舍五入的方法,再除以100,就是得到完成率了。
let total = 480;
let finish = 100;
let rate = Math.round(finish / total * 10000) / 100;
console.log('rate', rate + "%");
得到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)
console.log(' random10', random10)
console.log('random100', random100)
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()
扩展
使用该函数可以轻松地使用函数和变量来扩展该库 import。该import函数在mathjs实例上可用,可以使 用该create函数创建该实例。 math.js可以扩展自定义的一些函数或变量到math实例 中供自己使用。
表达式的编写
可以编写-个表达式,给表达式中的变量赋值然后进 行计算。使用场景:需要进行灵活计算的时候(例如 电站项目的开发场景) 一个简单的例子:编写-一个简单的函数表达式,然后. 调用这个表达式得到值。
const parser = math.parser()
parser.evaluate("f(x) = x- 5")
let a1 = parser.evaluate('f(2)')
let a2 = parser.evaluate("f(6)")
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的版本号。
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>
console.log(1.1 * 100)
console.log(0.1 + 0.2)
console.log(2.05 * 1.89 * 1.74 * 10000)
console.log(new Decimal(1.1)
.mul(new Decimal(100))
.toNumber()
console.log(new Decimal(0.1)
.plus(new Decimal(0.2))
.toNumber()
console.log(new Decimal(2.05)
.mul(new Decimal(1.89))
.mul(new Decimal(1.74))
.mul(new Decimal(10000))
.toNumber()
</script>
|