大家好,本文将围绕js数值计算公式是什么展开说明,js计算数学表达式是一个很多人都想弄明白的事情,想搞清楚javascript 数值计算需要先了解以下几个事情。
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
减法
在减法运算中,如果操作数为字符串,先尝试把它转换为数值,再进行运算Python中的所有运算符号。如果有一个操作数不是数字,则返回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:
< src="https://cdn.bootcss.com/decimal.js/10.1.1/decimal.js"></>
<>
//没有使用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
</>