# 数字计算处理常见函数
# Number.prototype.toFixed()
一个数值的字符串表现形式,不使用指数记数法,而是在小数点后有 digits(注:digits 具体值取决于传入参数)位数字。该数值在必要时进行四舍五入,另外在必要时会用 0 来填充小数部分,以便小数部分有指定的位数。 如果数值大于 1e+21,该方法会简单调用 Number.prototype.toString()
并返回一个指数记数法格式的字符串。
var numObj = 12345.6789;
numObj.toFixed(); // 返回 "12346":进行四舍六入五看情况,不包括小数部分
numObj.toFixed(1); // 返回 "12345.7":进行四舍六入五看情况
numObj.toFixed(6); // 返回 "12345.678900":用0填充
//prettier-ignore
(1.23e+20).toFixed(2); // 返回 "123000000000000000000.00"
(1.23e-10).toFixed(2); // 返回 "0.00"
//prettier-ignore
2.34.toFixed(1); // 返回 "2.3"
//prettier-ignore
2.35.toFixed(1) ; // 返回 '2.4'. 注意这里四舍五入了
//prettier-ignore
2.55.toFixed(1) ; // 返回 '2.5'. 注意它是向下舍入的,因为IEEE754标准的浮点数精度问题导致的。
//prettier-ignore
-2.34.toFixed(1); // 返回 -2.3 (由于操作符优先级,负数不会返回字符串)
//prettier-ignore
(-2.34).toFixed(1); // 返回 "-2.3" (若用括号提高优先级,则返回字符串)
# parseFloat
parseFloat
是个全局函数,不属于任何对象。
- 如果
parseFloat
在解析过程中遇到了正号(+)、负号(- U+002D HYPHEN-MINUS)、数字(0-9)、小数点(.)、或者科学记数法中的指数(e 或 E)以外的字符,则它会忽略该字符以及之后的所有字符,返回当前已经解析到的浮点数。 - 第二个小数点的出现也会使解析停止(在这之前的字符都会被解析)。
- 参数首位和末位的空白符会被忽略。
- 如果参数字符串的第一个字符不能被解析成为数字,则
parseFloat
返回NaN
。 parseFloat
也可以解析并返回Infinity
。parseFloat
解析 BigInt 为 Numbers, 丢失精度。因为末位 n 字符被丢弃。
考虑使用 Number(value)
进行更严谨的解析,只要参数带有无效字符就会被转换为 NaN 。
parseFloat
也可以转换一个已经定义了 toString
或者 valueOf
方法的对象,它返回的值和在调用该方法的结果上调用 parseFloat
值相同。
# parseInt
parseInt(string, radix)
解析一个字符串并返回指定基数的十进制整数, radix
是 2-36
之间的整数,表示被解析字符串的基数。
parseInt
函数将其第一个参数转换为一个字符串,对该字符串进行解析,然后返回一个整数或 NaN
。
parseInt('123', 5); // 将'123'看作5进制数,返回十进制数38 => 1*5^2 + 2*5^1 + 3*5^0 = 38
# Math.floor
Math.floor()
返回小于或等于一个给定数字的最大整数。
# Math.ceil
Math.ceil()
函数返回大于或等于一个给定数字的最小整数。
# Math.abs
Math.abs(x)
函数返回指定数字 “x“ 的绝对值。
# Math.pow
Math.pow()
函数返回基数(base)的指数(exponent)次幂,即 baseexponent。
Math.pow(2, 3); // 2 的 3 次幂是 8
# Math.random
Math.random()
函数返回一个浮点数, 伪随机数在范围从 0 到小于 1,也就是说,从 0(包括 0)往上,但是不包括 1(排除 1),然后您可以缩放到所需的范围。实现将初始种子选择到随机数生成算法;它不能被用户选择或重置。
Math.random()
不能提供像密码一样安全的随机数字。不要使用它们来处理有关安全的事情。使用Web Crypto API
来代替, 和更精确的window.crypto.getRandomValues()
方法.
# 两个数之间的随机数
不小于 min(有可能等于),并且小于(不等于)max。
function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min; //不含最大值,含最小值
}
# 两个数之间的随机整数
不小于 min (如果 min 不是整数,则不小于 min 的向上取整数),且小于(不等于)max。
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min; //不含最大值,含最小值
}
也许很容易想到用
Math.round()
来实现,但是这会导致你的随机数处于一个不均匀的分布,这可能不符合你的需求。
# 两个数之间的随机整数,包括两个数在内
包含 min 和 max 在内
function getRandomIntInclusive(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值
}
# Math.round
Math.round()
函数返回一个数字四舍五入后最接近的整数。
如果参数的小数部分大于 0.5,则参数将四舍五入为具有下一个更高的绝对值的整数。如果小于 0.5,则将参数舍入为具有较低绝对值的整数。如果小数部分正好是 0.5,则参数将沿 +∞ 方向四舍五入到下一个整数。请注意,这与许多语言的 round()
函数不同,后者通常将此情况舍入为远离零的下一个整数,而对于负数且分数部分恰好为 0.5 的情况则给出不同的结果。
Math.round(20.49); // 20
Math.round(20.5); // 21
Math.round(42); // 42
Math.round(-20.5); // -20
Math.round(-20.51); // -21