Calculator % disagrees with // on negative operands

Ouverte
#602 1 commentaire 0 réactions 1 personne assignée Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@YunJ-Chang y travaille déjà.

Depuis le 6/11/2026.

  • #607 par @YunJ-Chang — ouverte

Évaluation

Cette issue n'a pas encore été évaluée.

Description

Observed behavior

The task workspace calculator floors // but truncates %, so the two operators contradict each other when an operand is negative. No error is shown: the result is a wrong number. docs/task-mode.md tells learners to use this calculator rather than another app or tab during a timed attempt, so they have no other tool to catch it.

term() in web/calculator.js uses Math.floor(value / unary()) for // at line 129 and the JavaScript remainder value %= unary() at line 131. JavaScript's % takes the sign of the dividend, so it pairs with truncating division, not floored division. The identity a == (a // b) * b + a % b therefore fails whenever the operands have opposite signs. tests/browser/calculator.test.js covers only 17 // 5 and 17 % 5, so nothing exercises this case. docs/task-mode.md lists both operators without saying what they do with a negative operand.

Expected behavior

// and % should agree, so that a == (a // b) * b + a % b holds for every sign combination.
Approaches:

  1. Make % floored, so the result takes the sign of the divisor. // keeps its behavior, and the pair matches Python, whose syntax // and ** already follow.
  2. Make // truncate instead. This matches JavaScript's %, but changes an operator whose floor is deliberate and makes // differ from floor(a / b).
  3. Keep both and document the difference. This changes no code, but leaves the identity broken.

I propose approach 1, and I will send the pull request once the scope is agreed here.

Acceptance criteria:

  • a == (a // b) * b + a % b holds for every sign combination, and the table under Reproduction gives its expected column.
  • Results for non-negative operands do not change.
  • A zero divisor is still refused with the existing error.
  • tests/browser/calculator.test.js covers both operators with negative operands, and fails without the fix.
  • docs/task-mode.md states what % does with a negative operand.
Reproduction
  1. Open the calculator in the task workspace (web/task.html).
  2. Enter an expression from the table below.
  3. Press = and compare the result.
Expression Actual Expected from floored division
-7 // 3 -3 -3
-7 % 3 -1 2
(-7 // 3) * 3 + (-7 % 3) -10 -7
7 // -3 -3 -3
7 % -3 1 -2
CodeTrial version

codetrial 0.1.0 (4de45b1)

Environment

OS: Ubuntu 24.04.5 LTS on WSL2 (Windows 11)
Browser: Chrome

Sanitized evidence
Image

Captured at 4de45b1 by driving the calculator form in web/task.html with Playwright. The task section was unhidden by script, since starting a session needs Gemini and LiveKit. The form, its submit handler, and the evaluator were not changed. The files named in this report are unchanged through af66541.

Public data confirmation
  • I removed credentials, session tokens, candidate recordings, and personal interview content from this public report.
Langage dominant
Rust
Étoiles
223
Forks
148
Merge moyen
1 j 7 h
PR mergées (30 j)
225

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de sysprog21/codetrial

Toutes les issues de sysprog21/codetrial

Issues similaires

Plus d'issues Rust

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.