Java与C'的等价物是什么;s printf%g格式说明符?

Java与C'的等价物是什么;s printf%g格式说明符?,java,c,printf,formatter,Java,C,Printf,Formatter,我试着使用Formatter.format,但这似乎使尾数为0的数字保留尾数,而C版本则没有。Java中是否有与C的%g格式说明符等效的说明符,如果没有,是否有办法伪造它?出于兼容性的原因,我的意图是保留尾数与C完全相同 富科 控制台: $ javac Main.java && java Main 1.00000 $ gcc foo.c && ./a.out 1 类似地,使用1.2作为输入,Java版本的尾数更长 $ javac Main.java &&

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

富科

控制台:

$ 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

好的,您可以指定需要的位数:“%.2g”将1.2显示为1.20,您可以使用。通过将最小分数位数设置为0,但将最大分数位数保留得更大,它应该可以执行您想要的操作

这不像printf那么简单,但它应该能用。

你试过这门课吗

产出:

1
1.2
鉴于:

System.out.println(new DecimalFormat().format(1.2));
产出:

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

谢谢你们的意见,伙计们。我找不到一种方法来配置DecimalFormat或NumberFormat以精确克隆功能,但这种方法似乎有效(后面是一个示例):

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;
}
及其产出:

$ 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 $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 注意,使用

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")

基本上,我修改了表达式,以确保只删除小数部分末尾的零,并将其分为两种情况。但是谢谢你给我指出了正确的方向。

问题是如果尾数超过2位,它将截断尾数。我在问题中没有说,但出于兼容性的原因,我的意图是保留尾数与C完全相同。据我所知,C的%g将在尾数中添加尽可能多的数字,但不能再添加更多。为什么接受这一点?十进制格式似乎不提供选择
%e
%f
中较短者的
%g
功能。 $ 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
String.format("%.17g", x).replaceFirst("\\.?0+(e|$)", "$1")
String.format(Locale.US, "%.6g", x).replaceFirst("\\.0+(e|$)", "$1").replaceFirst("(\\.[0-9]*[1-9])(0+)(e|$)", "$1$3")