什么是Java相当于C的printf%G格式说明的?
题
我试着用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
您可以使用的NumberFormat 一>。由最小小数位数设置为0,但留下的最大更大,它应该做你想要什么。
这不是如printf容易,但它应该工作。
好了,你可以指定你要多少个数字:“%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")
基本上我修饰的表达,以确保仅在零小数部分的端部被去除,并且分成两个情况下,这。但感谢我指出了正确的方向。
不隶属于 StackOverflow