Calculator % disagrees with // on negative operands

Aperta
#602 1 commento 0 reazioni 1 assegnatario Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@YunJ-Chang ci sta già lavorando.

Dal 6/11/2026.

  • #607 di @YunJ-Chang — aperta

Valutazione

Questa issue non è ancora stata valutata.

Descrizione

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.
Lingua principale
Rust
Stelle
223
Fork
148
Merge medio
1g 10h
PR unite (30g)
227

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di sysprog21/codetrial

Tutte le issue di sysprog21/codetrial

Issue simili

Altre issue su Rust

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.