51 lines
1.2 KiB
TypeScript
51 lines
1.2 KiB
TypeScript
export const toFixedNumber = (
|
|
number: number,
|
|
digits: number,
|
|
base = 10) => {
|
|
const pow = Math.pow(base ?? 10, digits);
|
|
return Math.round(number * pow) / pow;
|
|
};
|
|
|
|
const gcd = (a: number, b: number): number => {
|
|
if (b <= 0.0000001) {
|
|
return a;
|
|
} else {
|
|
return gcd(b, a % b);
|
|
}
|
|
};
|
|
|
|
const formatDecimalToFraction = (decimal: number) => {
|
|
if (Math.abs(decimal - 0.33) < 0.011) {
|
|
return '1/3';
|
|
} else if (Math.abs(decimal - 0.66) <= 0.011) {
|
|
return '2/3';
|
|
} else {
|
|
const length = decimal.toString().length - 2;
|
|
|
|
let denominator = Math.pow(10, length);
|
|
let numerator = decimal * denominator;
|
|
|
|
const divisor = gcd(numerator, denominator);
|
|
|
|
numerator /= divisor;
|
|
denominator /= divisor;
|
|
|
|
return `${Math.floor(numerator)}/${Math.floor(denominator)}`;
|
|
}
|
|
};
|
|
|
|
export const formatNumberToFraction = (number: number) => {
|
|
const decimal = (1 - number % 1) > 0.01
|
|
? number % 1
|
|
: 0;
|
|
const integer = Math.round(Math.abs(number - decimal));
|
|
const fraction = decimal !== 0
|
|
? formatDecimalToFraction(Math.abs(decimal))
|
|
: '';
|
|
const sign = number > 0 ? '+' : '-';
|
|
const whole = integer > 0
|
|
? fraction ? `${integer} ` : integer
|
|
: '';
|
|
return `${sign}${whole}${fraction}`;
|
|
};
|