longevity: la copertura si confronta grezza, non arrotondata
Bug in aggrega(): la soglia veniva confrontata con la copertura gia' arrotondata a due decimali, quindi 0.396 (< 0.40) passava per 'ok' perche' arrotondava a 0.40. Confronto ora sulla copertura grezza; l'arrotondamento resta solo sul valore esposto. Generalizzata arrotonda1 in curve.ts a un numero qualsiasi di decimali (bit-exact, banker's rounding) e riusata qui a due decimali, invece di tenere una seconda logica di arrotondamento nel motore.
This commit is contained in:
@@ -37,6 +37,28 @@ describe('aggregazione e rinormalizzazione', () => {
|
||||
expect(r.stato).toBe('insufficiente');
|
||||
expect(r.copertura).toBe(0);
|
||||
});
|
||||
|
||||
// Bug trovato in revisione: il confronto con la soglia usava la copertura
|
||||
// GIA' arrotondata a due decimali, non quella grezza. Una copertura grezza
|
||||
// di 0.396 arrotonda a 0.40 - uguale alla soglia - e con l'arrotondamento
|
||||
// fatto PRIMA del confronto passava per 'ok'. Verificato anche contro
|
||||
// l'oracolo Python: aggregate([WeightedScore(90, 0.396), WeightedScore(None,
|
||||
// 0.604)]) -> (90.0, 0.4, 'insufficiente').
|
||||
it('una copertura grezza appena sotto la soglia resta insufficiente anche se arrotonda a 0.40', () => {
|
||||
const r = aggrega([{ punteggio: 90, peso: 0.396 }, { punteggio: null, peso: 0.604 }]);
|
||||
expect(r.stato).toBe('insufficiente');
|
||||
expect(r.copertura).toBeCloseTo(0.40, 2); // il valore esposto arrotonda a 0.40, ma lo stato resta insufficiente
|
||||
});
|
||||
|
||||
// Simmetrico: una copertura grezza appena SOPRA la soglia (0.404, che
|
||||
// arrotonda anch'essa a 0.40) deve restare 'ok' - il fix non deve aver
|
||||
// spostato la soglia dall'altra parte. Oracolo: aggregate([WeightedScore(90,
|
||||
// 0.404), WeightedScore(None, 0.596)]) -> (90.0, 0.4, 'ok').
|
||||
it('una copertura grezza appena sopra la soglia resta ok: il fix non ha spostato la soglia', () => {
|
||||
const r = aggrega([{ punteggio: 90, peso: 0.404 }, { punteggio: null, peso: 0.596 }]);
|
||||
expect(r.stato).toBe('ok');
|
||||
if (r.stato === 'ok') expect(r.copertura).toBeCloseTo(0.40, 2);
|
||||
});
|
||||
});
|
||||
|
||||
describe('assi, macro e Fitness Age', () => {
|
||||
|
||||
@@ -146,4 +146,28 @@ describe('curve del questionario, confrontate con l oracolo', () => {
|
||||
expect(arrotonda1(86.35)).toBe(86.3);
|
||||
expect(arrotonda1(-86.35)).toBe(-86.3);
|
||||
});
|
||||
|
||||
// Generalizzazione a `decimali` cifre (usata da cascata.ts per la copertura,
|
||||
// a 2 decimali): stesso criterio dei test sopra, un gradino piu' in la'.
|
||||
// 0.125 e 0.375 sono pareggi ESATTI a due decimali (double rappresentabili
|
||||
// in binario senza resto: 1/8 e 3/8), verificati anche a mano con
|
||||
// round(0.125, 2) e round(0.375, 2) in Python.
|
||||
it('arrotonda1(x, 2) arrotonda al pari sui pareggi esatti a due decimali', () => {
|
||||
expect(arrotonda1(0.125, 2)).toBe(0.12); // 12 e' pari: resta 0.12, non sale a 0.13
|
||||
expect(arrotonda1(0.375, 2)).toBe(0.38); // 37 e' dispari: sale a 0.38, non resta 0.37
|
||||
expect(arrotonda1(0.124, 2)).toBe(0.12); // non un pareggio: arrotondamento normale, per basso
|
||||
expect(arrotonda1(0.126, 2)).toBe(0.13); // non un pareggio: arrotondamento normale, per alto
|
||||
});
|
||||
|
||||
// 0.045 e' l'analogo a due decimali di 86.35: il double che gli sta dietro
|
||||
// vale 0.044999999999999998..., quindi Python (e l'oracolo) arrotondano
|
||||
// SENZA ambiguita' a 0.04. Ma 0.045 * 100 arrotonda ESATTAMENTE a 4.5 in
|
||||
// virgola mobile - un pareggio creato dalla moltiplicazione, non presente
|
||||
// nel valore originale - e un arrotondamento naive (Math.round(x*100)/100,
|
||||
// la stessa `arrotonda2` locale rimossa da cascata.ts) ci sarebbe caduto,
|
||||
// restituendo 0.05 invece di 0.04.
|
||||
it('arrotonda1(x, 2) non inventa un pareggio dove il double non ce l ha (0.045 -> 0.04, non un pareggio)', () => {
|
||||
expect(arrotonda1(0.045, 2)).toBe(0.04);
|
||||
expect(arrotonda1(-0.045, 2)).toBe(-0.04);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user