commit 45fcb55febd603da9437b99ec1b8f59416daef96
parent 26e2bf5ead33ffeddaec796d4ac902f7a6e3192d
Author: hrryt <harry@mayesfield.uk>
Date: Thu, 24 Sep 2026 16:28:31 +0100
Fix fraction formatting
Diffstat:
4 files changed, 22 insertions(+), 30 deletions(-)
diff --git a/src/components/questions/AddingFractionsQuestion.jsx b/src/components/questions/AddingFractionsQuestion.jsx
@@ -20,13 +20,13 @@ function getRandomFractions(seed) {
export default function AddingFractionsQuestion({ seed, showAnswer }) {
const [num1, denom1, num2, denom2] = getRandomFractions(seed++);
- const question = formatFraction(num1, denom1) + ' + ' + formatFraction(num2, denom2);
+ const question = formatFraction(num1, denom1) + formatFraction(num2, denom2, { showPlus: true });
const hcf = getHCF(denom1, denom2);
const sum = (num1 * denom2 + num2 * denom1) / hcf;
const lcm = denom1 * denom2 / hcf;
- const answer = formatFraction(sum, lcm, {showOne: true, showZero: true, simplify: true});
+ const answer = formatFraction(sum, lcm, { simplify: true });
return <Question question={question} answer={answer} showAnswer={showAnswer} />;
}
diff --git a/src/components/questions/QuadraticEquationQuestion.jsx b/src/components/questions/QuadraticEquationQuestion.jsx
@@ -12,7 +12,7 @@ function formatQuadraticExpression(a, b, c) {
function formatRoots(l, m, n, o) {
if (m / l == o / n) return `x = ${formatFraction(-m, l, { simplify: true })}`;
- if (-m / l == o / n) return `x = \\pm ${formatFraction(Math.abs(-m), l, { simplify: true })}`;
+ if (-m / l == o / n) return `x = \\pm ${formatFraction(Math.abs(m), l, { simplify: true })}`;
return `x = ${formatFraction(-m, l, { simplify: true })} \\text{ or } x = ${formatFraction(-o, n, { simplify: true })}`;
}
@@ -28,10 +28,10 @@ function formatFactors(l, m, n, o) {
const hcf1 = Math.abs(getHCF(l, m))
const hcf2 = Math.abs(getHCF(n, o))
const frontCoefficient = hcf1 * hcf2
- l = l / hcf1
- m = m / hcf1
- n = n / hcf2
- o = o / hcf2
+ l /= hcf1
+ m /= hcf1
+ n /= hcf2
+ o /= hcf2
const fFrontCoefficient = formatCoefficient(frontCoefficient, {showPlus: false, showOne: false, showZero: true})
if (l == n && m == o) return `${fFrontCoefficient}${formatFactor(l, m)}^2`
diff --git a/src/scripts/formatUtils.js b/src/scripts/formatUtils.js
@@ -4,30 +4,19 @@ export function formatVec(arr) {
return `\\bigl(\\begin{smallmatrix}${arr.join('\\\\')}\\end{smallmatrix}\\bigr)`
}
-export function formatCoefficient(x, parameters = { showPlus: false, showOne: true, showZero: true, suffix: '' }) {
- if (!parameters.showZero && x == 0) return '';
- const plus = parameters.showPlus ? '+' : '';
- const sign = x < 0 ? '-' : plus;
- x = Math.abs(x);
- parameters.showOne || x == 1 && (x = '');
- return sign + x + (parameters.suffix ?? '');
+export function formatCoefficient(value, { absoluteString=null, showPlus=false, showOne=true, showZero=true, suffix='' } = { }) {
+ if (!showZero && value == 0) return '';
+ absoluteString ??= Math.abs(value);
+ const plus = showPlus ? '+' : '';
+ const sign = value < 0 ? '-' : plus;
+ showOne || value == 1 && (absoluteString = '');
+ return sign + absoluteString + (suffix ?? '');
}
-// this thing is probably begging for bugs from simplification and zeroes.
-export function formatFraction(num, denom, parameters = { showPlus: false, showOne: true, showZero: true, simplify: false, suffix: '' }) {
- if (!parameters.showZero && num == 0) return '';
- if (getHCF(num, denom) == denom && parameters.simplify) return formatCoefficient(simplifyFraction(num, denom)[0], parameters)
- const plus = parameters.showPlus ? '+' : ''
- const sign = num / denom < 0 ? '-' : plus
-
- num = Math.abs(num)
- denom = Math.abs(denom);
- [num, denom] = parameters.simplify ? simplifyFraction(num, denom) : [num, denom]
- parameters.suffix || (parameters.suffix = '')
-
- let x = `\\frac{${num}}{${denom}}`
- parameters.showOne || num / denom == 1 && (x = '');
- return sign + x + parameters.suffix
+export function formatFraction(num, denom, { simplify=false, showPlus=false, showOne=true, showZero=true, suffix='' } = { }) {
+ simplify && ([num, denom] = simplifyFraction(num, denom));
+ const absoluteString = denom == 1 ? null : `\\frac{${Math.abs(num)}}{${denom}}`;
+ return formatCoefficient(num / denom, { absoluteString: absoluteString, showPlus: showPlus, showOne: showOne, showZero: showZero, suffix: suffix });
}
export function formatLine(line) {
diff --git a/src/scripts/mathsUtils.js b/src/scripts/mathsUtils.js
@@ -1,6 +1,9 @@
export function getHCF(a, b) {
+ if (b == 0) return a;
if (a == 1 && b == 1) return 1;
- return b == 0 ? a : getHCF(b, a % b);
+ const hcf = getHCF(b, a % b);
+ if (a * b < 0) return Math.abs(hcf);
+ return hcf;
}
export function simplifyFraction(num, denom) {