Το e-steki είναι μια από τις μεγαλύτερες ελληνικές διαδικτυακές κοινότητες με 66,074 εγγεγραμμένα μέλη και 2,387,657 μηνύματα σε 74,624 θέματα. Αυτή τη στιγμή μαζί με εσάς απολαμβάνουν το e-steki άλλα

Καλώς ήρθατε στο e-steki!

Εγγραφή Βοήθεια

[VC++] Float precision

klark

Νεοφερμένος

Το avatar του χρήστη klark
Ο klark αυτή τη στιγμή δεν είναι συνδεδεμένος Επαγγέλεται IT . Έχει γράψει 14 μηνύματα.

O klark έγραψε στις 20:52, 21-03-08:

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

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

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

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

0 Δεν μπορείτε να αξιολογήσετε αρνητικά το μήνυμα αυτόΔεν μπορείτε να αξιολογήσετε θετικά το μήνυμα αυτό
Παράθεση

fandago (Ә□⌂щяңš)

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

Το avatar του χρήστη fandago
Ο Ә□⌂щяңš αυτή τη στιγμή δεν είναι συνδεδεμένος Είναι 34 ετών και μας γράφει απο Αθήνα (Αττική). Έχει γράψει 2,620 μηνύματα.

O fandago μπορεί να φαίνεται αλλά ΔΕΝ έγραψε στις 21:02, 21-03-08:

#2
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

Αυτό ζητάς;

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

0 Δεν μπορείτε να αξιολογήσετε αρνητικά το μήνυμα αυτόΔεν μπορείτε να αξιολογήσετε θετικά το μήνυμα αυτό
Παράθεση

Bill

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

Το avatar του χρήστη Bill
Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος Έχει γράψει 2,195 μηνύματα.

O Bill έγραψε στις 21:09, 21-03-08:

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

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

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

edited Τελευταία επεξεργασία από το χρήστη Bill : 21-03-08 στις 21:15. Αιτία: σημείωση
1 Δεν μπορείτε να αξιολογήσετε αρνητικά το μήνυμα αυτόΔεν μπορείτε να αξιολογήσετε θετικά το μήνυμα αυτό
Παράθεση

fandago (Ә□⌂щяңš)

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

Το avatar του χρήστη fandago
Ο Ә□⌂щяңš αυτή τη στιγμή δεν είναι συνδεδεμένος Είναι 34 ετών και μας γράφει απο Αθήνα (Αττική). Έχει γράψει 2,620 μηνύματα.

O fandago μπορεί να φαίνεται αλλά ΔΕΝ έγραψε στις 21:16, 21-03-08:

#4
Αν το θέλεις καθαρά σε C++ υπάρχει και αυτός ο τρόπος:

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

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

edited Τελευταία επεξεργασία από το χρήστη fandago : 21-03-08 στις 21:22.
1 Δεν μπορείτε να αξιολογήσετε αρνητικά το μήνυμα αυτόΔεν μπορείτε να αξιολογήσετε θετικά το μήνυμα αυτό
Παράθεση

fandago (Ә□⌂щяңš)

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

Το avatar του χρήστη fandago
Ο Ә□⌂щяңš αυτή τη στιγμή δεν είναι συνδεδεμένος Είναι 34 ετών και μας γράφει απο Αθήνα (Αττική). Έχει γράψει 2,620 μηνύματα.

O fandago μπορεί να φαίνεται αλλά ΔΕΝ έγραψε στις 21:25, 21-03-08:

#5
Αρχική Δημοσίευση από Bill
*To link που έδωσα είναι για visual C++ .Νομιζα οτι στον τίτλο ελεγε για VC++ , αλλά και η sprintf δουλεύει κανονικά.
Έχεις δίκιο Bill, κατά την αλλαγή του τίτλου το ξέχασα.


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

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

edited Τελευταία επεξεργασία από το χρήστη fandago : 21-03-08 στις 21:32.
0 Δεν μπορείτε να αξιολογήσετε αρνητικά το μήνυμα αυτόΔεν μπορείτε να αξιολογήσετε θετικά το μήνυμα αυτό
Παράθεση

klark

Νεοφερμένος

Το avatar του χρήστη klark
Ο klark αυτή τη στιγμή δεν είναι συνδεδεμένος Επαγγέλεται IT . Έχει γράψει 14 μηνύματα.

O klark έγραψε στις 09:41, 22-03-08:

#6
ευχαριστώ πολύ για τις απαντήσεις σας, αλλα όπως προείπατε δεν είναι για visual c++. Οπότε το ερώτημα παραμένει, παρακαλώ όποιος έχει να δώσει κάποια απάντηση...να το κάνει....

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

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

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

edited Τελευταία επεξεργασία από το χρήστη klark : 22-03-08 στις 09:49.
0 Δεν μπορείτε να αξιολογήσετε αρνητικά το μήνυμα αυτόΔεν μπορείτε να αξιολογήσετε θετικά το μήνυμα αυτό
Παράθεση

Bill

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

Το avatar του χρήστη Bill
Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος Έχει γράψει 2,195 μηνύματα.

O Bill έγραψε στις 10:42, 22-03-08:

#7
Αρχική Δημοσίευση από klark
ευχαριστώ πολύ για τις απαντήσεις σας, αλλα όπως προείπατε δεν είναι για visual c++. Οπότε το ερώτημα παραμένει, παρακαλώ όποιος έχει να δώσει κάποια απάντηση...να το κάνει....

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

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

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

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

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

1 Δεν μπορείτε να αξιολογήσετε αρνητικά το μήνυμα αυτόΔεν μπορείτε να αξιολογήσετε θετικά το μήνυμα αυτό
Παράθεση

klark

Νεοφερμένος

Το avatar του χρήστη klark
Ο klark αυτή τη στιγμή δεν είναι συνδεδεμένος Επαγγέλεται IT . Έχει γράψει 14 μηνύματα.

O klark έγραψε στις 10:30, 26-03-08:

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

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

0 Δεν μπορείτε να αξιολογήσετε αρνητικά το μήνυμα αυτόΔεν μπορείτε να αξιολογήσετε θετικά το μήνυμα αυτό
Παράθεση

Bill

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

Το avatar του χρήστη Bill
Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος Έχει γράψει 2,195 μηνύματα.

O Bill έγραψε στις 10:56, 26-03-08:

#9
Δύο πιθανοί τρόποι είναι οι εξής:

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

ή
-με χρήση streams.
#include <sstream> ostringstream stringBuffer; float f = 2.7; buffer << f; string str = stringBuffer.str(); Aν θες να δεις κάποιο πρόγραμμα με streams για να δεις τη λειτουργία τους ορίστε ένα ,αλλά είναι υλοποιημένο για κονσόλα.(μπορεις να το βρεις κι εδώ)
#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; }

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

1 Δεν μπορείτε να αξιολογήσετε αρνητικά το μήνυμα αυτόΔεν μπορείτε να αξιολογήσετε θετικά το μήνυμα αυτό
Παράθεση

klark

Νεοφερμένος

Το avatar του χρήστη klark
Ο klark αυτή τη στιγμή δεν είναι συνδεδεμένος Επαγγέλεται IT . Έχει γράψει 14 μηνύματα.

O klark έγραψε στις 17:56, 01-04-08:

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

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

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

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

0 Δεν μπορείτε να αξιολογήσετε αρνητικά το μήνυμα αυτόΔεν μπορείτε να αξιολογήσετε θετικά το μήνυμα αυτό
Παράθεση
Απάντηση στο θέμα

Χρήστες

  • Τα παρακάτω 0 μέλη και 1 επισκέπτες διαβάζουν μαζί με εσάς αυτό το θέμα.
     
  • (View-All Tα παρακάτω 0 μέλη διάβασαν αυτό το θέμα τις τελευταίες 30 μέρες:
    Μέχρι και αυτή την στιγμή δεν έχει δει το θέμα κάποιο ορατό μέλος

Μοιραστείτε το

...με ένα φίλο

...με πολλούς φίλους