Implementa un tipo Decimal a precisione arbitraria.
I numeri in virgola mobile sono la rappresentazione più comune dei numeri reali non interi in informatica, e sono uno standard comune definito da IEEE 754. Sono molto flessibili e versatili, ma hanno comunque dei limiti. È risaputo che, nell'aritmetica in virgola mobile, 0.1 + 0.2 != 0.3.
La soluzione a questo problema è trovare un altro modo, senza perdita di precisione, per modellare numeri reali non interi a precisione arbitraria. Potrebbe risultare meno efficiente in termini di memoria o velocità di elaborazione rispetto ai numeri in virgola mobile; l'obiettivo è fornire risultati esatti.
Anche se Decimal è un tipo personalizzato, dovremmo comunque poterlo trattare come un numero: gli operatori ==, <, >, +, - e * dovrebbero funzionare tutti come previsto sui valori Decimal. Per praticità, non ti è richiesto di implementare la divisione, dato che la divisione a precisione arbitraria può sfuggire di mano molto rapidamente. (Come si rappresenta 1/3 a precisione arbitraria?)
In Rust, il modo per ottenere queste operazioni sui tipi personalizzati è implementare i trait corrispondenti. In particolare, dovrai implementare almeno PartialEq, PartialOrd, Add, Sub e Mul. A rigor di termini, dato che i numeri decimali formano un ordinamento totale, dovresti implementare anche Eq e Ord, anche se questi test non verificano quei trait.
Sarebbe molto facile implementare questo esercizio usando il crate bigdecimal. Non farlo: implementalo da solo.
Iscriviti a Exercism per imparare e padroneggiare Rust con 99 esercizi e il mentoring di persone reali, tutto gratis.