UNPKG

1.65 kBJavaScriptView Raw
1import { each, isNil } from '@antv/util';
2// 求以a为次幂,结果为b的基数,如 x^^a = b;求x
3// 虽然数学上 b 不支持负数,但是这里需要支持 负数
4export function calBase(a, b) {
5 var e = Math.E;
6 var value;
7 if (b >= 0) {
8 value = Math.pow(e, Math.log(b) / a); // 使用换底公式求底
9 }
10 else {
11 value = Math.pow(e, Math.log(-b) / a) * -1; // 使用换底公式求底
12 }
13 return value;
14}
15export function log(a, b) {
16 if (a === 1) {
17 return 1;
18 }
19 return Math.log(b) / Math.log(a);
20}
21export function getLogPositiveMin(values, base, max) {
22 if (isNil(max)) {
23 max = Math.max.apply(null, values);
24 }
25 var positiveMin = max;
26 each(values, function (value) {
27 if (value > 0 && value < positiveMin) {
28 positiveMin = value;
29 }
30 });
31 if (positiveMin === max) {
32 positiveMin = max / base;
33 }
34 if (positiveMin > 1) {
35 positiveMin = 1;
36 }
37 return positiveMin;
38}
39function digitLength(num) {
40 // Get digit length of e
41 var eSplit = num.toString().split(/[eE]/);
42 var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
43 return len > 0 ? len : 0;
44}
45/**
46 * 高精度加法,解决 0.1 + 0.2 !== 0.3 的经典问题
47 *
48 * @param num1 加数
49 * @param num2 被加数
50 * @return {number} 返回值
51 */
52export function precisionAdd(num1, num2) {
53 var num1Digits = digitLength(num1);
54 var num2Digits = digitLength(num2);
55 var baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
56 return (num1 * baseNum + num2 * baseNum) / baseNum;
57}
58//# sourceMappingURL=math.js.map
\No newline at end of file