Frage

Ich habe versucht Formatter.format verwenden, aber das scheint die Mantisse auf Zahlen mit 0 Mantisse zu verlassen, während die C-Version nicht. Gibt es ein Äquivalent von% g Formatspezifizierer des C in Java, und wenn nicht, ist es eine Möglichkeit, zu fälschen? Meine Absicht ist es, die Mantisse genau wie C ist aus Kompatibilitätsgründen zu bewahren.

foo.c

#include <stdio.h>

int main (int argc, char const *argv[])
{
    printf("%g\n", 1.0);
    return 0;
}

Main.java

class Main {
        public static void main(String[] args) {
                System.out.printf("%g\n", 1.0);
        }
}

Console:

$ javac Main.java && java Main
1.00000
$ gcc foo.c && ./a.out
1

In ähnlicher Weise mit 1,2 als Eingabe, die Mantisse länger in Java-Version

$ javac Main.java && java Main
1.20000
$ gcc foo.c && ./a.out
1.2
War es hilfreich?

Lösung

Haben Sie die java.text.DecimalFormat Klasse?

System.out.println(new DecimalFormat().format(1.0));

Ausgänge:

1

während:

System.out.println(new DecimalFormat().format(1.2));

Ausgänge:

1.2

Andere Tipps

Bearbeiten : Dieser Code bewirkt, dass der Bruchteil fehlt zu gehen, wenn der Exponent 17 Ziffern ist, wegen meiner Missverständnis, wie String.format diese Zahlen formatiert. Also bitte nicht nicht diesen Code verwenden: P

Danke für den Input, Jungs. Ich kann nicht einen Weg zu konfigurieren DecimalFormat oder Number finden, um genau die Funktionalität zu klonen, aber es scheint diese Methode funktioniert (gefolgt von einem Beispiel):

String.format("%.17g", x).replaceFirst("\\.?0+(e|$)", "$1");

main.c

#include <stdio.h>

int main (int argc, char const *argv[])
{
    printf("%.*g\n", 17, -0.0);
    printf("%.*g\n", 17, 0.0);
    printf("%.*g\n", 17, 1.0);
    printf("%.*g\n", 17, 1.2);
    printf("%.*g\n", 17, 0.0000000123456789);
    printf("%.*g\n", 17, 1234567890000000.0);
    printf("%.*g\n", 17, 0.0000000123456789012345678);
    printf("%.*g\n", 17, 1234567890123456780000000.0);
    return 0;
}

Main.java

class Main {
        public static String formatDouble(double x) {
                return String.format("%.17g", x).replaceFirst("\\.?0+(e|$)", "$1");
        }

        public static void main(String[] args) {
                System.out.println(formatDouble(-0.0));
                System.out.println(formatDouble(0.0));
                System.out.println(formatDouble(1.0));
                System.out.println(formatDouble(1.2));
                System.out.println(formatDouble(0.0000000123456789));
                System.out.println(formatDouble(1234567890000000.0));
                System.out.println(formatDouble(0.0000000123456789012345678));
                System.out.println(formatDouble(1234567890123456780000000.0));
        }
}

und deren Ausgänge:

$ gcc foo.c && ./a.out
-0
0
1
1.2
1.23456789e-08
1234567890000000
1.2345678901234567e-08
1.2345678901234568e+24
$ javac Main.java && java Main
-0
0
1
1.2
1.23456789e-08
1234567890000000
1.2345678901234567e-08
1.2345678901234568e+24

könnten Sie ein Number . die Mindestbruchstellen auf 0 Durch die Einstellung, aber die maximalen größer zu verlassen, sollte es tun, was Sie wollen.

Es ist nicht so einfach, wie printf, aber es sollte funktionieren.

gut, können Sie festlegen, wie viele Stellen Sie wollen: "% .2G" wird 1.2 als 1.20 angezeigt

Beachten Sie, dass mit

String.format("%.17g", x).replaceFirst("\\.?0+(e|$)", "$1")

nicht für 1.2345e-20 (die Null von den Endleisten, die Herstellung von 1.2345e-2). Hier ist, was ich am Ende mit in meinem Code:

String.format(Locale.US, "%.6g", x).replaceFirst("\\.0+(e|$)", "$1").replaceFirst("(\\.[0-9]*[1-9])(0+)(e|$)", "$1$3")

Im Grunde modifizierte ich den Ausdruck nur Nullen am Ende des Bruchteils zu gewährleisten, werden entfernt und teilen diese in zwei Fällen. Aber danke für mich in der richtigen Richtung.

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