当前位置: 首页 > 知识库问答 >
问题:

Java-设置要打印的双精度长度时,是否包括小数和前面的数字?

谢俊英
2023-03-14

我正在打印一个矩阵,每个元素都有相同的长度打印在屏幕上,以便于阅读。

如果我做了这样的事情:

System.out.printf("%.16f", x);

然后根据前面的(全部)值,我得到不同的长度:

x = 1;
x = 2.345;
x = 10;
x = 1243.5678;

提供以下输出:

// 1.0000000000000000
// 2.3450000000000000
// 10.0000000000000000
// 1243.5678000000000000

这让矩阵变得一团糟。如何将整个double(包括小数和整数)限制在一定的长度?因此,对于之前的案例,输出将是:

// 1.0000000000000000
// 2.3450000000000000
// 10.000000000000000
// 1243.5678000000000

编辑#1

我不想只是用零填充。前导零没有吸引力,可能导致误读。即使我现在有%.16f,我可能会使用更少的精度,并且每个数字都是有效的(非零)。

共有3个答案

蒙奇
2023-03-14

你应该使用BigDecimal。

大概是这样的:

BigDecimal db = new BigDecimal(d).setScale(6, BigDecimal.ROUND_HALF_UP);

您可以在此处阅读更多信息:。

您可以将上面的Double转换为String,然后将字符串转换为BigDecimal。

你可以阅读这篇文章了解更多细节。

秦琦
2023-03-14

一个选项是链接两个字符串格式化调用。第一个电话是:

String.format("%.16f", x)

这将给出浮点的任意宽度字符串表示,精度为16位。下一个调用应该给出一个18个字符的固定宽度字符串,如果需要,该字符串将被右截断。

System.out.format("%18s : %s", String.format("%.16f", x));
吴安和
2023-03-14

有不同的方法来格式化输出(但不完全相同的输出):

>

  • 使用printf方法(假设21位宽):

    System.out.printf("%21.16f%n", 1.0);
    System.out.printf("%21.16f%n", 2.345);
    System.out.printf("%21.16f%n", 10.0);
    System.out.printf("%21.16f", 1243.5678);
    

    =

    使用ApacheCommonsLang库。假设您希望小数点后有16位,小数点前有5位,则可能会产生以下结果:

    System.out.println(StringUtils.rightPad(String.valueOf(1.0), 21, '0'));
    System.out.println(StringUtils.rightPad(String.valueOf(2.345), 21, '0'));
    System.out.println(StringUtils.rightPad(String.valueOf(10.0), 21, '0'));
    System.out.println(StringUtils.rightPad(String.valueOf(1243.5678), 21, '0'));
    

    输出:

    1.0000000000000000000
    2.3450000000000000000
    10.000000000000000000
    1243.567800000000000

    另一种方法是使用DecimalFormat

    final String format = "00000.0000000000000000";
    DecimalFormat formatter = new DecimalFormat(format);
    System.out.println(formatter.format(1.0));
    System.out.println(formatter.format(2.345));
    System.out.println(formatter.format(10.0));
    System.out.println(formatter.format(1243.5678));
    

    以及输出:

    00001.0000000000000000
    00002.34500000000000000
    00010.0000000000000000
    01243.567800000000000

  •  类似资料:
    • 从我之前的问题“浮点精度是可变的还是不变的?”我收到一个回复说, C提供DBL_DIG、DBL_DECIMAL_DIG及其浮点和长双精度对应项。DBL_DIG表示最小相对小数精度。DBL_DECIMAL_DIG可以看作是最大的相对十进制精度。 我查了这些宏指令。它们位于标题< code >中 以下是最小精度值的宏。 如果我以表面值接受这些宏,我会假设的最小十进制精度为6,而and 则最小十进制精确

    • 问题内容: 使用double时,如何使用模数运算符处理Java的怪异行为? 例如,你所期望的结果是(事实上,谷歌说,我不是要疯了),但是当我在Java中,我得到运行它。 我了解这是Java存储和处理方式加倍的结果,但是有没有解决的方法? 问题答案: 如果需要精确的结果,请使用精确的类型: 为什么是3.8000 … 003?因为Java使用FPU来计算结果。3.9不可能以IEEE双精度表示法精确存储

    • 我想把我的十进制修剪成像8.063这样的东西,而不是原来的E-98.0638304611694。我已经为它实现了一个函数,但是当它里面有时,它就不起作用了。我应该修改哪一部分?? 编辑 当我尝试调用函数时,当前实现给了我。

    • 问题内容: 是否有可能做到这一点? 我知道代码可能不会去这样的事情,但怎么也去了? 问题答案: 这将检查双精度值的四舍五入值是否与双精度值相同。 你的变量可能具有或值,并且始终具有int值,因此,如果你的变量等于,则它必须具有int值。 如果变量的值是无穷大或负无穷大,那么这也不起作用,因此向条件添加“只要变量不是无穷大”。

    • 嗨,我最近看到了一个类似这样的问题 在我回答了这个问题后,事实证明我弄错了,我回答了整数。MIN_VALUE但正确的答案是整数。MAX_VALUE。经过进一步的测试,我意识到我对大于整数的int施加的任何双精度。MAX_VALUE只是使int等于整数。MAX_VALUE。例如 经过进一步的测试,我意识到如果你试图将long转换为int,似乎会将int分配给一个看似随机的数字。 所以我的问题是。到底

    • 我想把小数点改成,而不是原来的。我已经为它实现了一个函数,但是当它中有时,它就不起作用了。我应该修改哪个部分?? 编辑 当我尝试调用函数时,当前实现给我的。