Στρογγυλοποίηση, επιτέλους

Λοιπόν, δεν υπάρχει πιο εκνευριστικό πράγμα από το να ψάχνεις για κάτι απλό και να μην το βρίσκεις. Αυτή η standard library έχει ένα σωρό συναρτήσεις και κάτι απλό όσο μια στρογγυλοποίηση δεν δέησε κανένας επιτέλους να την ενσωματώσει;

Μα καλά με τα νεύρα μου (μας) παίζουν;

Εντάξει δεν είναι και τόσο δύσκολο να φτιαχτεί, αλλά θα μπορούσε να υπάρχει έτοιμη και ίσως να την πείραζαν λίγο ώστε να είναι και γρήγορη.

Λοιπόν, μιας και πέρασαν κάποιες μέρες από τότε που την έψαχνα και δεν την έβρισκα, και έχω πλέον ηρεμήσει, (γιατί βάραγα το κεφάλι μου στον τοίχο επειδή ήμουν σίγουρος ότι υπήρχε και απλώς δεν την έβλεπα), μπορώ να σας βεβαιώσω ότι πιο εύκολα θα βρείτε κάτι ψάχνωντας στο internet παρά στον δίσκο σας. Αλλά για να μην ψάχνετε άλλο αφού φτάσατε ώς εδώ, πάρτε τον κώδικα από εδώ:

#include <cmath>

typedef	signed		__int64	LONGLONG;
typedef unsigned	__int64	ULONGLONG;

static ULONGLONG POWERS[] = { 1, 10, 100, 1E3, 1E4, 1E5, 1E6, 1E7, 1E8,
        1E9, 1E10, 1E11, 1E12, 1E13, 1E14, 1E15, 1E16, 1E17, 1E18, 1E19
};

double Round(double dVal)
{
    if(dVal < 0.0)
        return ceil(dVal - 0.5);
    else
        return floor(dVal + 0.5);
}

double Round(double dVal, short iPrec)
{
    ULONGLONG power;

    if (iPrec == 0) return Round(dVal);
    if (iPrec < 0)
    {
        power = POWERS[-iPrec];
        if(dVal < 0.0)
            return (ceil(dVal / power - 0.5) * power);
        else
            return (floor(dVal / power + 0.5) * power);
    }
    //iPrec > 0
    power = POWERS[iPrec];
    if(dVal < 0.0)
        return (ceil(dVal * power - 0.5) / power);
    else
        return (floor(dVal * power + 0.5) / power);
}

Καλό θα είναι να έχετε υπόψη σας ότι η στρογγυλοποίηση με αυτή την υλοποίηση μπορεί να παίξει (θεωρητικά πάντα λόγω της μορφής με την οποία αποθηκεύονται οι doubles) στο διάστημα [-19, 19]. Στην πράξη άντε να χρειαστείτε στρογγυλοποίηση στο 2ο, 3ο, άντε 4ο δεκαδικό ψηφίο, για παραπάνω αμφιβάλλω.

One Comment

  1. Διαβάζοντας το post αυτό ένιωσα επιτέλους ότι δεν είμαι ο μόνος ” (γιατί βάραγα το κεφάλι μου στον τοίχο επειδή ήμουν σίγουρος ότι υπήρχε και απλώς δεν την έβλεπα)”.
    με βοήθησες πολύ! ..thanks!