Στρογγυλοποιήστε έναν πλωτήρα σε ένα κανονικό πλέγμα προκαθορισμένων σημείων

Στρογγυλοποιήστε έναν πλωτήρα σε ένα κανονικό πλέγμα προκαθορισμένων σημείων

Εφόσον το πλέγμα σας είναι κανονικό, απλώς βρείτε έναν μετασχηματισμό από ακέραιους σε αυτό το πλέγμα. Ας υποθέσουμε λοιπόν ότι το πλέγμα σας είναι

0.2  0.4  0.6  ...

Στη συνέχεια στρογγυλοποιείτε κατά

float round(float f)
{
    return floor(f * 5 + 0.5) / 5;
    // return std::round(f * 5) / 5; // C++11
}

Το τυπικό ceil() , floor() Οι λειτουργίες δεν έχουν ακρίβεια, υποθέτω ότι θα μπορούσαν να το αντιμετωπίσουν προσθέτοντας τη δική σας ακρίβεια - αλλά αυτό μπορεί να δημιουργήσει σφάλματα - π.χ.

double ceil(double v, int p)
{
  v *= pow(10, p);
  v = ceil(v);
  v /= pow(10, p);
}

Υποθέτω ότι θα μπορούσατε να δοκιμάσετε για να δείτε εάν αυτό είναι αξιόπιστο για εσάς;


Ένας αλγόριθμος που μπορείτε να χρησιμοποιήσετε:

  • λάβετε 10-to-the-power(number-of-significant-digits) (=P10)
  • πολλαπλασιάστε τη διπλή σας τιμή με P10
  • προσθήκη:0,5 (ή αφαιρέστε εάν είναι αρνητικό - δείτε το σχόλιο του Ankush Shah)
  • διαιρέστε το ακέραιο τμήμα αυτού του αθροίσματος με το (P10) - η απάντηση θα είναι ο στρογγυλεμένος αριθμός σας