9

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
4

6 に答える 6

4

edit : このコードにより、指数が 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
于 2009-05-16T22:30:07.560 に答える
2

java.text.DecimalFormatクラスを試しましたか?

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

出力:

1

一方:

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

出力:

1.2
于 2009-05-16T21:08:26.057 に答える
1

NumberFormatを使用できます。最小の小数桁を0に設定し、最大を大きくしておくと、必要な処理が実行されます。

printfほど簡単ではありませんが、機能するはずです。

于 2009-05-16T21:07:50.240 に答える
0

必要な桁数を指定できます。「%。2g」は1.2を1.20として表示します。

于 2009-05-16T21:04:56.550 に答える
0

上記の解決策はどれも完全ではありません。場合によってはかなりの数の問題があります。そこで、この特定の問題に対処するために小さなライブラリ Double2String を作成しました。

https://github.com/coconut2015/double2string

于 2021-07-12T02:00:54.103 に答える