문제

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 만 제거하고 이것을 두 가지 경우로 분할하기 위해 표현식을 수정했습니다. 하지만 올바른 방향으로 나를 지적 해 주셔서 감사합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top