C의 printf %g 형식 지정자와 동등한 Java는 무엇입니까?
문제
Formatter.format을 사용하려고 시도했지만 Mantissa는 0 Mantissa의 숫자로 남겨 두는 것처럼 보이지만 C 버전은 그렇지 않습니다. Java에는 C의 %G 형식 지정자와 동등한 것이 있습니까? 그렇지 않은 경우 가짜 방법이 있습니까? 저의 의도는 호환성 이유로 C와 똑같은 Mantissa를 보존하는 것입니다.
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);
}
}
콘솔:
$ javac Main.java && java Main
1.00000
$ gcc foo.c && ./a.out
1
마찬가지로 입력으로 1.2의 경우 Mantissa는 Java 버전에서 더 길어집니다.
$ javac Main.java && java Main
1.20000
$ gcc foo.c && ./a.out
1.2
해결책
당신은 시도 했습니까? java.text.decimalformat 수업?
System.out.println(new DecimalFormat().format(1.0));
출력 :
1
반면:
System.out.println(new DecimalFormat().format(1.2));
출력 :
1.2
다른 팁
편집하다:이 코드는 지수가 17 자리 인 경우 분수 부품이 누락됩니다. 따라서이 코드를 사용하지 마십시오 : p
입력 해 주셔서 감사합니다. DecimalFormat 또는 NumberFormat을 구성하여 기능을 정확하게 복제하는 방법을 찾을 수는 없지만이 메소드가 작동하는 것 같습니다 (예 : 예제).
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));
}
}
그리고 그들의 출력 :
$ 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
당신은 a를 사용할 수 있습니다 숫자. 최소 분수 숫자를 0으로 설정하지만 최대 숫자를 남겨두면 원하는 것을해야합니다.
printf만큼 쉽지는 않지만 작동해야합니다.
글쎄, 당신은 원하는 숫자 수를 지정할 수 있습니다 : "%.2g"는 1.2로 1.2로 표시됩니다.
사용하십시오
String.format("%.17g", x).replaceFirst("\\.?0+(e|$)", "$1")
1.2345E-20에 실패합니다 (끝에서 0을 벗겨서 1.2345E-2를 생성). 내 코드에서 사용한 내용은 다음과 같습니다.
String.format(Locale.US, "%.6g", x).replaceFirst("\\.0+(e|$)", "$1").replaceFirst("(\\.[0-9]*[1-9])(0+)(e|$)", "$1$3")
기본적으로 나는 분수 부품의 끝에서 0 만 제거하고 이것을 두 가지 경우로 분할하기 위해 표현식을 수정했습니다. 하지만 올바른 방향으로 나를 지적 해 주셔서 감사합니다.