如何使用Java打印没有科学记数法的双精度值?

2022-08-31 05:19:16

我想在Java中打印一个没有指数形式的双精度值。

double dexp = 12345678;
System.out.println("dexp: "+dexp);

它显示此 E 表示法:。1.2345678E7

我希望它像这样打印它:12345678

防止这种情况的最佳方法是什么?


答案 1

Java 在双精度中阻止 E 表示法:

将双精度数转换为普通数的五种不同方法:

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class Runner {
    public static void main(String[] args) {
        double myvalue = 0.00000021d;

        //Option 1 Print bare double.
        System.out.println(myvalue);

        //Option2, use decimalFormat.
        DecimalFormat df = new DecimalFormat("#");
        df.setMaximumFractionDigits(8);
        System.out.println(df.format(myvalue));

        //Option 3, use printf.
        System.out.printf("%.9f", myvalue);
        System.out.println();

        //Option 4, convert toBigDecimal and ask for toPlainString().
        System.out.print(new BigDecimal(myvalue).toPlainString());
        System.out.println();

        //Option 5, String.format 
        System.out.println(String.format("%.12f", myvalue));
    }
}

此程序打印:

2.1E-7
.00000021
0.000000210
0.000000210000000000000001085015324114868562332958390470594167709350585
0.000000210000

它们都是相同的值。

Protip:如果您对为什么这些随机数字在双精度值中出现超过某个阈值感到困惑,那么此视频解释了:计算机爱好者为什么+等于?0.10.20.30000000000001

http://youtube.com/watch?v=PZRI1IfStY0


答案 2

您可以使用 :printf()%f

double dexp = 12345678;
System.out.printf("dexp: %f\n", dexp);

这将打印 .如果您不想要分数部分,请使用dexp: 12345678.000000

System.out.printf("dexp: %.0f\n", dexp);

0 in 表示分数部分的 0 位,即没有分数部分。如果要打印具有所需小数位数的小数部分,则只需提供如下所示的数字,而不是0。默认情况下,小数部分最多打印 6 位小数位。%.0f%.8f

这使用文档中解释的格式说明符语言。

此处拼写了原始代码中使用的默认格式。toString()


推荐