[VC++] Float precision

klark

Νεοφερμένος

Ο klark αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 40 ετών και επαγγέλεται IT. Έχει γράψει 47 μηνύματα.
Αγαπητοί φίλοι μου, όπως βλέπετε είμαι νέο μέλος στην σελίδα και αλήθεια είναι ότι θα ήθελα τη βοήθειά σας, ετοιμάζω ένα πρόγραμμα σε C++ που έχει και παραθυρικό περιβάλλον, σε αυτό το πρόγραμμα έχω εισάγει ένα timer ο οποίος κάθε δευτερόλεπτο αθροίζει σε μία μεταβλητή(count) τύπου float μία τιμή 0,001112. αυτή η μεταβλητή count εμφανίζεται σε ένα edit box. Η ερώτησή μου είναι πως θα κάνω την μεταβλητή αυτή να έχει μόνο δύο δεκαδικά ψηφία μετά την υποδιαστολή, γιατί τώρα εμφανίζει κάτι τέτοιο 0,06546545845151 και θέλω να το κάνω να φαίνεται 0,06.

Όποιος μπορεί να με βοηθήσει, παρακαλώ ας το κάνει

ευχαριστώ εκ των προτέρων :/:
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

fandago

Διακεκριμένο μέλος

Ο Ә□⌂щяңš αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 40 ετών και μας γράφει απο Αθήνα (Αττική). Έχει γράψει 6,876 μηνύματα.
printf - C++ Reference
%[flags][width][.precision][length]specifier
Where specifier is the most significant one and defines the type and the interpretation of the value of the coresponding

For integer specifiers (d, i, o, u, x, X): precision specifies the minimum number of digits to be written. If the value to be written is shorter than this number, the result is padded with leading zeros. The value is not truncated even if the result is longer. A precision of 0 means that no character is written for the value 0.
For e, E and f specifiers: this is the number of digits to be printed after the decimal point.
For g and G specifiers: This is the maximum number of significant digits to be printed.
For s: this is the maximum number of characters to be printed. By default all characters are printed until the ending null character is encountered.
For c type: it has no effect.
When no precision is specified, the default is 1. If the period is specified without an explicit value for precision, 0 is assumed.
Για παράδειγμα το:
printf ("floats: %.2f", 3.1416);

θα βγάλει 3.14

Αυτό ζητάς;:worry:
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Bill

Επιφανές μέλος

Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος. Έχει γράψει 10,408 μηνύματα.
Κάτι που θα μπορουσες να κανεις είναι να χρησιμοποιήσεις την sprintf.
Μέσα στην sprintf θα περασεις τον αριθμό στο buffer με την ακριβεια ψηφιων που το θες.
Code:
double x = 345.2214455;
char szBuffer[255];
sprintf(szBuffer,"%.4f",x);
Ρίξε μια ματιά εδώ.Μήπως βρεις και τίποτα άλλο που χρειάζεσαι.

*To link που έδωσα είναι για visual C++ .Νομιζα οτι στον τίτλο ελεγε για VC++ :P , αλλά και η sprintf δουλεύει κανονικά.
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Τελευταία επεξεργασία:

fandago

Διακεκριμένο μέλος

Ο Ә□⌂щяңš αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 40 ετών και μας γράφει απο Αθήνα (Αττική). Έχει γράψει 6,876 μηνύματα.
Αν το θέλεις καθαρά σε C++ υπάρχει και αυτός ο τρόπος:

std::cout<< fixed << std::setprecision(2) << o_float_sou << "\n";
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Τελευταία επεξεργασία:

fandago

Διακεκριμένο μέλος

Ο Ә□⌂щяңš αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 40 ετών και μας γράφει απο Αθήνα (Αττική). Έχει γράψει 6,876 μηνύματα.
*To link που έδωσα είναι για visual C++ .Νομιζα οτι στον τίτλο ελεγε για VC++ :P , αλλά και η sprintf δουλεύει κανονικά.
Έχεις δίκιο Bill, κατά την αλλαγή του τίτλου το ξέχασα. :(


Και μιας και εγώ μάλλον ήμουν off topic, δίνοντας οδηγίες για καθαρά C και C++ αντίστοιχα (:redface:) και αφού δεν έχω ασχοληθεί με VC++ για να δω τι διαφορές υπάρχουν, ας δώσω ένα link που βρήκα στα γρήγορα που ίσως βοηθήσει:worry::
Visual C++ Standard Library: setprecision
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Τελευταία επεξεργασία:

klark

Νεοφερμένος

Ο klark αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 40 ετών και επαγγέλεται IT. Έχει γράψει 47 μηνύματα.
ευχαριστώ πολύ για τις απαντήσεις σας, αλλα όπως προείπατε δεν είναι για visual c++. Οπότε το ερώτημα παραμένει, παρακαλώ όποιος έχει να δώσει κάποια απάντηση...να το κάνει....:)

ευχαριστώ και πάλι...:D
Επίσης, ο τρόπος με τον οποίο δίνουμε τιμή σε ένα edit box είναι ο εξής

float count=0;
~..
count += 0.001112;
Edit1->Text=count; //όπου εδώ στην ουσία το κουτάκι παίρνει την τιμή που του δίνουμε, η οποία βέβαια είναι κάπως έτσι 0.006156454556.
Τα παραπάνω τα παρέθεσα σε περίπτωση που βοηθούν στην απάντηση, ευχαριστώ.
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Τελευταία επεξεργασία:

Bill

Επιφανές μέλος

Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος. Έχει γράψει 10,408 μηνύματα.
ευχαριστώ πολύ για τις απαντήσεις σας, αλλα όπως προείπατε δεν είναι για visual c++. Οπότε το ερώτημα παραμένει, παρακαλώ όποιος έχει να δώσει κάποια απάντηση...να το κάνει....:)

ευχαριστώ και πάλι...:D
Επίσης, ο τρόπος με τον οποίο δίνουμε τιμή σε ένα edit box είναι ο εξής

float count=0;
~..
count += 0.001112;
Edit1->Text=count; //όπου εδώ στην ουσία το κουτάκι παίρνει την τιμή που του δίνουμε, η οποία βέβαια είναι κάπως έτσι 0.006156454556.
Τα παραπάνω τα παρέθεσα σε περίπτωση που βοηθούν στην απάντηση, ευχαριστώ.

Mάλλον δεν διάβασες καλά το ποστ μου.:P Ειχα γράψει για VC++ απλά διορθώθηκε ο τίτλος πορσωρινά κι εβαλα υποσημειωση οτι δουλευει και για C++.

Κάτι που θα μπορουσες να κανεις είναι να χρησιμοποιήσεις την sprintf.
Μέσα στην sprintf θα περασεις τον αριθμό στο buffer με την ακριβεια ψηφιων που το θες.
Code:
double x = 345.2214455;
char szBuffer[255];
sprintf(szBuffer,"%.4f",x);
Ρίξε μια ματιά εδώ.Μήπως βρεις και τίποτα άλλο που χρειάζεσαι.

*To link που έδωσα είναι για visual C++ .Νομιζα οτι στον τίτλο ελεγε για VC++ :P , αλλά και η sprintf δουλεύει κανονικά.

Όπως και να χει μπορείς να κάνεις αυτό που σου έγραψα παραπάνω και στη συνέχεια αν θες να περνάς το νούμερο ως αριθμό κι όχι ως αλφαριθμητικό .Υπάρχoυν συναρτήσείς που μετατρέπουν το αλφαριθμιτικό σε ακέραιο ή κινητής υποδιαστολής.Αυτές είναι οι atoi() και atof().Η δεύτερη είναι αυτή που χρειάζεσαι για την κινητή υποδιαστολή.
Συντάσσεται ως εξής:
Code:
double number;
number = atof( szBuffer );
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

klark

Νεοφερμένος

Ο klark αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 40 ετών και επαγγέλεται IT. Έχει γράψει 47 μηνύματα.
Μήπως μπορείτε να μου πείτε πως μετατρέπουμε το float σε αλφαριθμητικό? Εγώ βρήκα κάτι
extern PACKAGE AnsiString __fastcall FloatToStr(Extended Value);
αλλά δεν κατάλαβα πως χρησιμοποιείται. Όποιος ξέρει ας μου δώσει τα φώτα του...ευχαριστώ
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Bill

Επιφανές μέλος

Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος. Έχει γράψει 10,408 μηνύματα.
Δύο πιθανοί τρόποι είναι οι εξής:

-με την spirntf
Code:
[FONT=Lucida Console][SIZE=2][COLOR=blue]char[/COLOR] str[50]  = "";
 [COLOR=blue]float[/COLOR] f = 2.7;
 sprintf(str, "%f", f);[/SIZE][/FONT]
Σε αυτή την περίπτωση πρέπει να έχεις φροντίσει να διαλέξεις μέγεθος του αλφαριθμιτικού σου ώστε να αποφύγεις κάποιο buffer overflow.

ή
-με χρήση streams.
Code:
[FONT=Lucida Console][SIZE=2] #include <sstream>
 
 ostringstream stringBuffer;
 [COLOR=blue]float[/COLOR] f = 2.7;
 buffer << f;
 [COLOR=blue]string[/COLOR] str = stringBuffer.str();[/SIZE][/FONT]
Aν θες να δεις κάποιο πρόγραμμα με streams για να δεις τη λειτουργία τους ορίστε ένα ,αλλά είναι υλοποιημένο για κονσόλα.(μπορεις να το βρεις κι εδώ)
Code:
                                                                                                                                                                                                                                                                                                                                                                                                                    #include <iostream>
#include <sstream>
using namespace std;

int main () 
{

  float val =123.444;  
  stringstream ss (stringstream::in | stringstream::out);
  ss << val;
  ss >> val;
  string mychar =ss.str();
  cout << val << endl;
  cout<<mychar.c_str();
  return 0;
}
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

klark

Νεοφερμένος

Ο klark αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 40 ετών και επαγγέλεται IT. Έχει γράψει 47 μηνύματα.
Κάτι που θα μπορουσες να κανεις είναι να χρησιμοποιήσεις την sprintf.
Μέσα στην sprintf θα περασεις τον αριθμό στο buffer με την ακριβεια ψηφιων που το θες.
Code:
double x = 345.2214455;
char szBuffer[255];
sprintf(szBuffer,"%.4f",x);
Ρίξε μια ματιά εδώ.Μήπως βρεις και τίποτα άλλο που χρειάζεσαι.

*To link που έδωσα είναι για visual C++ .Νομιζα οτι στον τίτλο ελεγε για VC++ :P , αλλά και η sprintf δουλεύει κανονικά.


τελικά έκανα τα παραπάνω και δούλεψε!! ήθελε λίγο πατέντα αλλά το αποτέλεσμα μετράει, ευχαριστώ όλους για τη βοήθεια
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 16 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Χρήστες Βρείτε παρόμοια

  • Τα παρακάτω 0 μέλη και 1 επισκέπτες διαβάζουν μαζί με εσάς αυτό το θέμα:
    Tα παρακάτω 0 μέλη διάβασαν αυτό το θέμα:
  • Φορτώνει...
Top