Frage

Ich habe auf diesen einen Kopf worden hämmern den ganzen Tag. Das C ++ Projekt Zur Zeit arbeite ich an hat eine Anforderung einen editierbaren Wert anzuzeigen. Die aktuell gewählte Ziffer zeigt den erhöhten Wert oben und verringerte Wert unter für die Ziffer. Es ist nützlich, in der Lage sein, den editierbaren Wert, da beide eine Zahl und Sammlung von Ziffern zu verweisen. Was wäre genial, wenn es eine Wende Form einer Gleitkommazahl war, aber ich habe es nicht gelungen, eine solche Lösung zu finden. Ich warf diese Frage dort zu sehen, ob es etwas offensichtlich fehle ich oder ob ich nur rollen meine eigenen.


Danke für den Hinweis! Ich suchte nach einer Lösung der Hoffnung, die nicht von float umwandeln würde -> string -> int, aber ich denken , dass der beste Weg ist, von Floating-Point-Quantisierung Fragen wegzukommen. Ich landete gehen mit boost :: Format und Referenzierung nur die einzelnen Zeichen des Strings. Ich kann nicht sehen, dass ein großer Unterschied in der Leistung ist im Vergleich zu Kombinationen von modf und fmod mit einer Ziffer aus einem Schwimmer zu bekommen, um zu versuchen (es wahrscheinlich nicht nur, dass hinter den Kulissen, nur robuster als meine Implementierung).

War es hilfreich?

Lösung

Interne Darstellung der Schwimmer Punktzahl sind nicht wie sind Sie sehen. Sie können nur bis zu einem stirng gegossen.

Um zu werfen, dies zu tun:

char string[99];
sprintf(string,"%f",floatValue);

Oder sehen Sie: http: // www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1

Wikipedia-Artikel kann mehr auf die Darstellung erklären: http://en.wikipedia.org/wiki/ FLOATING_POINT

Andere Tipps

Oh, es gibt viele Möglichkeiten, um eine Zeichenfolge zu konvertieren. ( obwohl ich lieber tun s n printf () selbst.)

Oder Sie in einen int umwandeln konnte und die Ziffern mit Modul und integer-Division herausziehen. Sie können die Anzahl der Stellen mit log zählen {Base10}.

(Denken Sie daran:. Log {baseA} _X / log {baseA} _B = log {Baseb} _X)

Beispiel:

#define SHOW(X) cout << # X " = " << (X) << endl

int
main()
{
  double d = 1234.567;

  SHOW( (int(d)%10000) / 1000 );
  SHOW( (int(d)%1000)  / 100  );
  SHOW( (int(d)%100)   / 10   );
  SHOW( (int(d)%10)           );
  SHOW( (int(d*10)  % 10)     );
  SHOW( (int(d*100) % 10)     );
  SHOW( (int(d*1000)% 10)     );

  SHOW( log(d)/log(10) );
}

Auch wenn Sie sollten verwenden static_cast ...

Achten Sie auf Exponentialnotation aus. Mit einer sehr großen oder sehr kleinen Zahlen, können Sie ein Problem haben.

Gleitkommazahlen hat auch runde Probleme, die Ihnen einige Trauer verursachen können. (Es ist der gleiche Grund, warum wir Betreiber nicht == zwischen zwei Doppelzimmern verwenden. Oder warum Sie nicht auf einem * b == b * a verlassen können. Je nach den genauen Werten von a & b, können sie sehr leicht abweichen um aus 10 ^ -25).

Sie können zwischen String gegossen und schweben nur mit boost :: lexical_cast. Sie können jedoch nicht direkt Index der Schwimmer Form - es ist intern nicht als Dezimalstellen gespeichert. Dies ist wahrscheinlich nicht so sehr ein Problem. Für Ihre UI, werden Sie die meisten halten wahrscheinlich eine Zeichenfolge Form der Anzahl wie auch immer, mit Conversions und von Schwimmer in dem Getter / Setter.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top