W Javie, kiedy dostarczam zmienną zmiennoprzecinkową do printf lub String.format, to nic nie daje. Aby zilustrować, przykład:

public class test {
    public static void main(String arg[]) {
        double d = 123.456; 
        System.out.println("println: " + d + " " + (int) d);
        System.out.printf("printf as int: %d%n", (int) d);
        System.out.printf("printf with %%f: %f%n", d);
        System.out.printf("printf with %%e: %e%n", d);
        System.out.printf("printf with %%g: %g%n", d);
        System.out.printf("printf with %%a: %a%n", d);
    }
}

Daje

in println: 123.456 123
in printf as int: 123
in printf with %f: 
in printf with %e: 
in printf with %g: 
in printf with %a:

Jak widać, działa z println, ale nie działa na printf. To samo dotyczy String.format. Jeśli podam szerokość i precyzję, robi to samo - nic nie daje.

Co ja robię źle?

EDYCJA: używam lokalizacji en_US.UTF-8; Nie jestem pewien, jakiej wersji Javy używam. Co wiem to: skompilowałem go za pomocą gcc (gcj), wersja 4.7.2; I mieć zainstalowane gcj JRE w wersji 4.7.2 i OpenJDK JRE w wersji 7u7-2.3.2a.; Edytowałem kod. Teraz jest to cały kod programu. Napisałem go jako mały program testowy po tym, jak zauważyłem problemy z liczbami zmiennoprzecinkowymi w moim innym kodzie.

2
librin.so.1 26 wrzesień 2012, 21:56

2 odpowiedzi

Najlepsza odpowiedź

Jest duża szansa, że ​​to błąd w GCJ. Zobacz tutaj: http://bugs.debian.org/cgi-bin/ bugreport.cgi?bug=561685

Pozbądź się GCJ i użyj OpenJDK lub Sun/OracleJDK.

3
Piotr Praszmo 26 wrzesień 2012, 22:59

Oto mój kod i moje wyniki. Nie widzę problemu.

package foo;

public class Main {

/**
 * @param args
 */
public static void main(String[] args) {
    double d = 123.456; 
    System.out.println("in println: " + d + " " + (int) d);
    System.out.printf("in printf as int: %d%n", (int) d);
    System.out.printf("in printf with %%f: %a%n", d);
    System.out.printf("in printf with %%e: %e%n", d);
    System.out.printf("in printf with %%g: %g%n", d);
    System.out.printf("in printf with %%a: %a%n", d);

  }

 }

Daje

in println: 123.456 123
in printf as int: 123
in printf with %f: 0x1.edd2f1a9fbe77p6
in printf with %e: 1.234560e+02
in printf with %g: 123.456
in printf with %a: 0x1.edd2f1a9fbe77p6
2
user1201210 26 wrzesień 2012, 22:04