我试着用Formatter.format,但似乎留下号码尾数为0的尾数,而C版没有。有没有在Java中C'S%G格式说明的等效,如果没有,有没有办法可以找到答案?我的目的是保留尾数恰好像C的兼容性的原因。

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作为输入,尾数为较长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位的,因为我的的String.format如何格式化这些数字误解。所以,不要请不要使用此代码: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

好了,你可以指定你要多少个数字:“%0.2克”将显示1.2为1.20

注意,使用

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

失败为1.2345E-20(条带从端部零,产生1.2345E-2)。 以下是我最终使用在我的代码:

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

基本上我修饰的表达,以确保仅在零小数部分的端部被去除,并且分成两个情况下,这。但感谢我指出了正确的方向。

scroll top