website

source code for the ttmaths.uk website
Log | Files | Refs | README

commit 45fcb55febd603da9437b99ec1b8f59416daef96
parent 26e2bf5ead33ffeddaec796d4ac902f7a6e3192d
Author: hrryt <harry@mayesfield.uk>
Date:   Thu, 24 Sep 2026 16:28:31 +0100

Fix fraction formatting

Diffstat:
Msrc/components/questions/AddingFractionsQuestion.jsx | 4++--
Msrc/components/questions/QuadraticEquationQuestion.jsx | 10+++++-----
Msrc/scripts/formatUtils.js | 33+++++++++++----------------------
Msrc/scripts/mathsUtils.js | 5++++-
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) {