[java] Dezimalstellen in Doppelschritten verschieben



Answers

Nein - Wenn Sie Dezimalwerte genau speichern möchten, verwenden Sie BigDecimal . double kann einfach keine Zahl wie 0.1 genau darstellen, genauso wenig wie Sie den Wert eines dritten genau mit einer endlichen Anzahl von Dezimalziffern schreiben können.

Question

Also habe ich einen doppelten Satz, der 1234 entspricht, ich möchte eine Dezimalstelle verschieben, um 12,34 zu machen

Um das zu tun, multipliziere ich zweimal 1 bis 1234, so ähnlich

double x = 1234;
for(int i=1;i<=2;i++)
{
  x = x*.1;
}
System.out.println(x);

Dies wird das Ergebnis "12.340000000000002" drucken

Gibt es einen Weg, den Doppelpunkt 12.34 korrekt zu speichern, ohne ihn einfach auf zwei Dezimalstellen zu formatieren?




In Finanzsoftware ist es üblich, ganze Zahlen für ein paar Cent zu verwenden. In der Schule wurde uns beigebracht, wie man Festkomma anstelle von Gleitkomma verwendet, aber das sind normalerweise Zweierpotenzen. Das Speichern von Pennies in Ganzzahlen könnte auch "Fixpunkt" genannt werden.

int i=1234;
printf("%d.%02d\r\n",i/100,i%100);

In der Klasse wurden wir allgemein gefragt, welche Zahlen in einer Basis genau dargestellt werden können.

Für base=p1^n1*p2^n2 ... können Sie jedes N darstellen, wobei N = n * p1 ^ m1 * p2 ^ m2 ist.

Lassen Sie base=14=2^1*7^1 ... Sie können 1/7 1/14 1/28 1/49 aber nicht 1/3 darstellen

Ich weiß über Finanzsoftware Bescheid - ich habe die Finanzberichte von Ticketmaster von VAX asm auf PASCAL umgestellt. Sie hatten ihre eigenen formatln () mit Codes für Pennies. Der Grund für die Umwandlung war, dass 32-Bit-Ganzzahlen nicht mehr ausreichten. +/- 2 Milliarden Pennies sind 20 Millionen Dollar und das ist für die Weltmeisterschaft oder die Olympischen Spiele übergelaufen, habe ich vergessen.

Ich wurde zur Verschwiegenheit verpflichtet. Naja. In der Akademie, wenn es gut ist, veröffentlichst du; In der Industrie halten Sie es geheim.




Dies liegt daran, wie Computer Gleitkommazahlen speichern. Sie tun es nicht genau. Als Programmierer sollten Sie diesen Fließkomma-Leitfaden lesen , um sich mit den Versuchen und Schwierigkeiten beim Umgang mit Fließkommazahlen vertraut zu machen.




Ja da ist. Bei jeder Doppeloperation können Sie die Genauigkeit verlieren, aber die Genauigkeit variiert für jede Operation und kann durch Auswahl der richtigen Abfolge von Operationen minimiert werden. Wenn Sie zum Beispiel die Zahlenmenge multiplizieren, ist es am besten, vor dem Multiplizieren nach Exponenten zu sortieren.

Jedes anständige Buch über Zahlenverarbeitung beschreibt dies. Zum Beispiel: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

Und um deine Frage zu beantworten:

Verwenden Sie Teilen statt Multiplizieren, damit Sie das richtige Ergebnis erhalten.

    double x = 1234;
    for(int i=1;i<=2;i++)
    {
      x =  x / 10.0;
    }
    System.out.println(x);



Related