我尝试使用 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/