Η αριθμητική υπερχείλιση συμβαίνει όταν ένας υπολογισμός, όπως μια αριθμητική πράξη ή μια μετατροπή τύπου, καταλήγει σε μια τιμή μεγαλύτερη από τη χωρητικότητα του τύπου που τη λαμβάνει.
Οι εκφράσεις τύπου int και long, καθώς και οι αντίστοιχες ανυπόγραφες εκφράσεις τους, θα αναδιπλωθούν σιωπηλά σε αυτές τις περιπτώσεις.
Η συμπεριφορά των υπολογισμών ακεραίων μπορεί να τροποποιηθεί με τη χρήση της λέξης-κλειδιού checked. Όταν προκύψει υπερχείλιση μέσα σε ένα μπλοκ checked, πετιέται ένα στιγμιότυπο της OverflowException.
int one = 1;
checked
{
int expr = int.MaxValue + one; // OverflowException is thrown
}
// or
int expr2 = checked(int.MaxValue + one); // OverflowException is thrown
Οι εκφράσεις τύπου float και double θα πάρουν μια ειδική τιμή, το άπειρο.
Οι εκφράσεις τύπου decimal θα πετάξουν ένα στιγμιότυπο της OverflowException.
Η χώρα Hyperia έχει τα προβλήματά της. Ειδικότερα, ο πληθωρισμός έχει ξεφύγει από κάθε έλεγχο. Σε έφεραν με αεροπλάνο για να αναλάβεις σύμβαση στην κεντρική τράπεζα.
Για να απλοποιήσει την εσωτερική της διαχείριση, η κεντρική τράπεζα έχει χωρίσει κάθε ονομαστική αξία σε μέρη: μια βάση που μένει σχετικά αμετάβλητη και έναν πολλαπλασιαστή (τον ίδιο για όλες τις ονομαστικές αξίες) που μπορεί να αλλάζει κάθε χρόνο, κάθε εβδομάδα ή ακόμα και κάθε μέρα.
Όταν εκτυπώνονται, οι ονομαστικές αξίες στα χαρτονομίσματα είναι το γινόμενο της βάσης και του πολλαπλασιαστή.
Την εποχή που καθιερώθηκε αυτό το σύστημα, το μικρότερο χαρτονόμισμα είχε ήδη ονομαστική αξία 10,000,000. Ο πίνακας παρακάτω δείχνει την κατάσταση (για τις 3 πρώτες ονομαστικές αξίες) όταν πρωτοκαθιερώθηκε το σύστημα. Τα πράγματα έχουν χειροτερέψει πολύ από τότε, και δεν αλλάζει μόνο ο πολλαπλασιαστής αλλά και η βάση.
| Βάση | Πολλαπλασιαστής | Ονομαστική αξία |
|---|---|---|
| 10,000 | 1,000 | 10,000,000 |
| 50,000 | 1,000 | 50,000,000 |
| 100,000 | 1,000 | 100,000,000 |
| ... | 1,000 | ... |
Συνοψίζοντας, αυτό σημαίνει ότι ονομαστική αξία = βάση * πολλαπλασιαστής.
Υλοποίησε τη μέθοδο CentralBank.DisplayDenomination(), η οποία δέχεται τη βάση και τον πολλαπλασιαστή και επιστρέφει μια συμβολοσειρά με το γινόμενό τους (βάση * πολλαπλασιαστής). Η αριθμητική συμβολοσειρά που επιστρέφεται δεν πρέπει να είναι μορφοποιημένη.
Αν η πράξη του πολλαπλασιασμού προκαλέσει υπερχείλιση, τότε θα πρέπει να επιστραφεί η συμβολοσειρά "*** Too Big ***".
CentralBank.DisplayDenomination(10000L, 1000L);
// => "10000000"
CentralBank.DisplayDenomination(long.MaxValue / 2, 10000L);
// => "*** Too Big ***"
Η κεντρική τράπεζα χρησιμοποιεί την ίδια λογική του πολλαπλασιαστή για να καταγράφει το ΑΕΠ στο εσωτερικό της. Τα στατιστικά καταγράφονται σε μια ονομαστική αξία βάσης και μετά κλιμακώνονται με τη βοήθεια του πολλαπλασιαστή.
Υλοποίησε τη μέθοδο CentralBank.DisplayGDP(), η οποία δέχεται το ΑΕΠ βάσης και τον τρέχοντα πολλαπλασιαστή και επιστρέφει το ΑΕΠ ως συμβολοσειρά.
Αν το ΑΕΠ δεν μπορεί να υπολογιστεί, τότε επιστρέφεται το "*** Too Big ***".
CentralBank.DisplayGDP(555f, 10000f);
// => "5550000"
CentralBank.DisplayGDP(float.MaxValue / 2, 10000f);
// => "*** Too Big ***"
Το αφεντικό σου στην τράπεζα θέλει να βεβαιωθεί ότι δεν θα υπάρξουν προβλήματα την ώρα της μισθοδοσίας.
Υλοποίησε τη μέθοδο CentralBank.DisplayChiefEconomistSalary(), η οποία δέχεται έναν μισθό εκφρασμένο σε μονάδες βάσης (όπως παραπάνω) και έναν πολλαπλασιαστή και επιστρέφει μια συμβολοσειρά που περιέχει το γινόμενο.
Αν ο μισθός δεν μπορεί να υπολογιστεί, τότε επιστρέφεται το "*** Much Too Big ***".
CentralBank.DisplayChiefEconomistSalary(555000m, 10000m);
// => "5550000000"
CentralBank.DisplayChiefEconomistSalary(555000m, decimal.MaxValue / 2L);
// => "*** Much Too Big ***"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις C# με 62 έννοιες178 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.