From 9350c837e57a9d7ce20cdfd187b1172aea4a33f9 Mon Sep 17 00:00:00 2001 From: ztimson Date: Mon, 27 May 2024 13:51:41 -0400 Subject: [PATCH] Added math functions --- package.json | 2 +- src/index.ts | 1 + src/math.ts | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/math.ts diff --git a/package.json b/package.json index c45b50e..2014d58 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ztimson/utils", - "version": "0.9.0", + "version": "0.10.0", "description": "Utility library", "author": "Zak Timson", "license": "MIT", diff --git a/src/index.ts b/src/index.ts index a705372..c78143c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,7 @@ export * from './download'; export * from './emitter'; export * from './errors'; export * from './logger'; +export * from './math'; export * from './misc'; export * from './objects'; export * from './promise-progress'; diff --git a/src/math.ts b/src/math.ts new file mode 100644 index 0000000..5b79f74 --- /dev/null +++ b/src/math.ts @@ -0,0 +1,45 @@ +/** + * Convert decimal number to fraction + * + * @example + * ```js + * dec2Frac(1.25) // Outputs: "1 1/4" + * ``` + * + * @param {number} num Number to convert + * @return {string} Fraction with remainder + */ +export function dec2Frac(num: number) { + const gcd = (a: number, b: number): number => { + if (b < 0.0000001) return a; + return gcd(b, ~~(a % b)); + }; + + const len = num.toString().length - 2; + let denominator = Math.pow(10, len); + let numerator = num * denominator; + const divisor = gcd(numerator, denominator); + numerator = ~~(numerator / divisor); + denominator = ~~(denominator / divisor) + const remainder = ~~(numerator / denominator); + numerator -= remainder * denominator; + return `${remainder ? remainder + ' ' : ''}${~~(numerator)}/${~~(denominator)}`; +} + +/** + * Convert fraction to decimal number + * + * @example + * ```js + * fracToDec('1 1/4') // Outputs: 1.25 + * ``` + * + * @param {string} frac Fraction to convert + * @return {number} Faction as a decimal + */ +export function fracToDec(frac: string) { + let split = frac.split(' '); + const whole = split.length == 2 ? Number(split[0]) : 0; + split = (split.pop()).split('/'); + return whole + (Number(split[0]) / Number(split[1])); +}