簡體   English   中英

什么是C的printf%g格式說明符的Java等價物?

[英]What is the Java equivalent of C's printf %g format specifier?

我嘗試使用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;
}

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

編輯 :如果指數為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

你試過java.text.DecimalFormat類嗎?

System.out.println(new DecimalFormat().format(1.0));

輸出:

1

然而:

System.out.println(new DecimalFormat().format(1.2));

輸出:

1.2

您可以使用NumberFormat 通過將最小分數設置為0,但保留最大值,它應該做你想要的。

它不像printf那么容易,但它應該有效。

注意使用

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

基本上我修改了表達式以確保僅刪除小數部分末尾的零並將其拆分為兩種情況。 但是感謝你指出我正確的方向。

好吧,你可以指定你想要的位數:“%。2g”將1.2顯示為1.20

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM