|
14 | 14 | * @example fraction(0.33,2) // [10, 3]
|
15 | 15 | */
|
16 | 16 | function fraction(number, accuracy = 6) {
|
17 |
| - let returnVal = []; |
18 |
| - let inp = typeof number === "number" ? number : () => {throw new TypeError("Invalid number, a number type value expected");}; |
19 |
| - let acc = typeof accuracy === "number" && accuracy >= 1 && accuracy <= 16 ? accuracy : () => {throw new TypeError("Invalid accuracy, a integer type value expected between 1 - 16");} |
20 |
| - if (Number.isInteger(inp)) { |
21 |
| - returnVal = [inp, 1]; |
22 |
| - } else { |
23 |
| - inp = inp.toString(); |
| 17 | + if (typeof number === "number" && Number.isNaN(number) && Number.isFinite(number) |
| 18 | + && typeof accuracy === "number" && Number.isNaN(accuracy) && accuracy >= 1 && accuracy <= 16) { |
| 19 | + let neg = 1; |
| 20 | + // if number is negative then following code will run |
| 21 | + if (number < 0) { |
| 22 | + neg = -1; |
| 23 | + number = Math.abs(number); |
| 24 | + } |
| 25 | + // if number is 0 then it will return [0, 1] |
| 26 | + if (number === 0) return [0, 1]; |
| 27 | + if (Number.isInteger(number)) return [neg * number, 1]; |
| 28 | + // if number is not an integer then follwing code will run |
| 29 | + number = number.toString(); |
24 | 30 | let len;
|
25 |
| - let reg = inp.match(/(\d+?)\1+$/); |
26 |
| - if (reg && reg[0].length > acc) { |
27 |
| - let pos = inp.split("."); |
28 |
| - inp = inp.replace(reg[0], reg[1]); |
29 |
| - let rec = pos[0] + pos[1].replace(reg[0], ""); |
30 |
| - inp = Number(rec + reg[1]) - Number(rec); |
31 |
| - len = Number( |
32 |
| - "9".repeat(reg[1].length) + "0".repeat(rec.length - pos[0].length) |
33 |
| - ); |
| 31 | + let reg = number.match(/(\d+?)\1+$/); |
| 32 | + // if number is repeating decimal then following code will run |
| 33 | + if (reg && reg[0].length > accuracy) { |
| 34 | + let pos = number.split("."); |
| 35 | + number = number.replace(reg[0], reg[1]); |
| 36 | + let rec = pos[0] + pos[1].replace(reg[0], ""); |
| 37 | + number = Number(rec + reg[1]) - Number(rec); |
| 38 | + len = Number( |
| 39 | + "9".repeat(reg[1].length) + "0".repeat(rec.length - pos[0].length) |
| 40 | + ); |
34 | 41 | } else {
|
35 |
| - inp = inp.replace(".", ""); |
36 |
| - len = 10 ** (inp.length - 1); |
37 |
| - inp = Number(inp); |
38 |
| - } |
39 |
| - let d = true; |
40 |
| - while (d) { |
41 |
| - if (inp % 5 == 0 && len % 5 == 0) { |
42 |
| - inp /= 5; |
43 |
| - len /= 5; |
44 |
| - } else if (inp % 2 == 0 && len % 2 == 0) { |
45 |
| - inp /= 2; |
46 |
| - len /= 2; |
47 |
| - } else if (inp % 3 == 0 && len % 3 == 0) { |
48 |
| - inp /= 3; |
49 |
| - len /= 3; |
50 |
| - } else if (inp % 7 == 0 && len % 7 == 0) { |
51 |
| - inp /= 7; |
52 |
| - len /= 7; |
53 |
| - } else { |
54 |
| - d = false; |
55 |
| - } |
| 42 | + // if number is not repeating decimal then following code will run |
| 43 | + number = number.replace(".", ""); |
| 44 | + len = 10 ** (number.length - 1); |
| 45 | + number = Number(number); |
56 | 46 | }
|
57 |
| - returnVal= [inp, len]; |
58 |
| - } |
59 |
| - return returnVal; |
60 |
| - } |
61 |
| - |
62 |
| - export { fraction }; |
| 47 | + // it will findout the gcd of number and len to reduce the fraction nomitor and denominator like 4/8 will be 1/2 |
| 48 | + let div = gcd(number, len); |
| 49 | + number /= div; |
| 50 | + len /= div; |
| 51 | + return [neg * number, len]; |
| 52 | + } else { |
| 53 | + if (typeof number !== "number") throw new TypeError("Invalid number, a number type value expected"); |
| 54 | + if (typeof accuracy !== "number") throw new TypeError("Invalid accuracy, a number type value expected"); |
| 55 | + if (Number.isNaN(number)) throw new TypeError("Invalid number, a number type value expected"); |
| 56 | + if (Number.isNaN(accuracy)) throw new TypeError("Invalid accuracy, a number type value expected"); |
| 57 | + if (!Number.isFinite(number)) throw new RangeError("Invalid number, a finite number expected"); |
| 58 | + if (accuracy < 1 || accuracy > 16) throw new RangeError("Invalid accuracy, a integer type value expected between 1 and 16"); |
| 59 | + } |
| 60 | +} |
| 61 | + |
| 62 | +function gcd(a, b) { |
| 63 | + if (b == 0) return a; |
| 64 | + return gcd(b, a % b); |
| 65 | +} |
| 66 | + |
| 67 | +export { fraction }; |
0 commit comments