Skip to content

Commit be441e7

Browse files
authored
Updated Fraction.js
1 parent 82fd7fc commit be441e7

File tree

1 file changed

+48
-43
lines changed

1 file changed

+48
-43
lines changed

Maths/Fraction.js

Lines changed: 48 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -14,49 +14,54 @@
1414
* @example fraction(0.33,2) // [10, 3]
1515
*/
1616
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();
2430
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+
);
3441
} 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);
5646
}
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

Comments
 (0)