java - C 的 printf %g 格式说明符的 Java 等价物是什么?

标签 java c printf formatter

我尝试使用 Formatter.format,但这似乎将尾数留在尾数为 0 的数字上,而 C 版本则没有。 Java 中是否有等效于 C 的 %g 格式说明符,如果没有,是否有办法伪造它?出于兼容性原因,我的意图是保留与 C 完全一样的尾数。

foo.c

#include <stdio.h>

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

主.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

最佳答案

编辑: 如果指数是 17 位,此代码会导致小数部分丢失,因为我误解了 String.format 如何格式化这些数字。所以请不要使用此代码:P

感谢您的投入,伙计们。我找不到配置 DecimalFormat 或 NumberFormat 以准确复制功能的方法,但似乎此方法有效(后面有一个示例):

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

主.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;
}

主.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

关于java - C 的 printf %g 格式说明符的 Java 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/873298/

相关文章:

c - 在C中搜索多个单词,并在它们后面显示以逗号分隔的信息

java - 为什么Java序列化占用这么大的空间?

java - Tapestry 5.4 Beanedit 表单警报

java - 尝试以不同的方式实现优先级队列

c - 用户空间和内核空间之间的共享信号量

C/C++ printf() 和 scanf() 运行程序时颠倒

c - 如何找到二维数组行中字母的最大值

庆典 printf : How do I output\x and\f within double quotes?

java - 在 Android 中,如何从另一个 Activity 引用一个实例化的 Activity 对象?

c - 将 printf 重定向到管道 C