如何使用Java打印一个不使用科学计数法的双精度值?

18 浏览
0 Comments

如何使用Java打印一个不使用科学计数法的双精度值?

我想在Java中以非指数形式打印一个双精度值。

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

它显示的是这种E表示法:1.2345678E7

我希望它打印成这样:12345678

如何防止这种情况发生的最佳方法是什么?

0
0 Comments

问题出现的原因是作者想要以非科学计数法的方式打印一个double值,并且还有一些尝试的方法,但是这些方法并没有解决问题。问题的解决方法是使用DecimalFormat类,并设置最大小数位数来实现打印double值时不使用科学计数法。

以下是问题的解决方法:

1. 使用DecimalFormat类:

DecimalFormat df = new DecimalFormat("#");
df.setMaximumFractionDigits(8);
System.out.println(df.format(myvalue));

2. 使用printf函数:

System.out.printf("%.9f", myvalue);
System.out.println();

3. 将double值转换为BigDecimal,并使用toPlainString()方法:

System.out.print(new BigDecimal(myvalue).toPlainString());
System.out.println();

4. 使用String.format函数:

System.out.println(String.format("%.12f", myvalue));

以上方法可以确保以非科学计数法的方式打印double值。

0
0 Comments

如何在Java中打印一个没有科学计数法的double值?

问题的原因:

- 使用Double.toString()、System.out.println或FloatingDecimal.toJavaFormatString时,如果double值小于10^-3或大于等于10^7,会使用科学计数法。

- 使用% f时,默认的小数精度是6,否则可以硬编码,但如果小数位数较少,会添加额外的零。

- 使用setMaximumFractionDigits(0)或%.0f可以去掉任何小数精度,这对于整数/长整数来说是可以的,但对于double来说不行。

- 使用DecimalFormat时,会受到本地化影响。

解决方法:

- 使用DecimalFormat和Locale.ENGLISH可以解决这个问题。

- 使用df.setMaximumFractionDigits(340)来设置最大小数位数为340,确保不会舍入double值。

- 使用df.format(myValue)来打印double值。

示例代码:

double myValue = 0.00000021d;
DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
df.setMaximumFractionDigits(340);
System.out.println(df.format(myValue)); // Output: 0.00000021

这个解决方法的原理:

- 使用DecimalFormat可以格式化double值。

- 通过设置最大小数位数为340,可以避免舍入和丢失精度的问题。

- 使用Locale.ENGLISH可以确保小数分隔符为点号。

其他解决方案的问题:

- 使用Double.toString()、System.out.println或FloatingDecimal.toJavaFormatString会使用科学计数法。

- 使用% f或手动设置小数精度会导致额外的零。

- 使用setMaximumFractionDigits(0)或%.0f会去掉任何小数精度。

- 使用DecimalFormat时受到本地化影响,小数分隔符可能不是点号。

为什么设置最大小数位数为340?

- setMaximumFractionDigits接受一个整数,但其实现允许的最大位数为DecimalFormat.DOUBLE_FRACTION_DIGITS,即340。

- Double.MIN_VALUE = 4.9E-324,所以使用340位数可以确保不会舍入double值且不会丢失精度。

关于使用BigDecimal的想法:

- 使用new BigDecimal(myvalue).toPlainString()可以消除科学计数法,但输出的结果可能不符合预期。

Scala中如何使用这个解决方法:

- 可以使用BigDecimal.valueOf(0.00000021d).toPlainString()来实现相同的功能。

这个解决方法对于float类型不适用:

- float类型的值可能会出现精度丢失的问题。

这个问题在2022年仍然存在:

- 使用DecimalFormat时,传入的double值在某些情况下会丢失小数位数的精度。

- 这可能是由于舍入导致的,可以尝试使用其他方法来确保精度始终保持正确。

0
0 Comments

使用Java打印一个不带科学计数法的double值的方法

有一种方法是使用printf()函数和%f格式化符号:

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

这将打印出dexp: 12345678.000000。如果不想要小数部分,可以使用:

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

其中的0表示小数部分的位数为0,即没有小数部分。如果想要打印带有指定位数的小数部分,可以将0替换为具体的数字,例如%.8f。默认情况下,小数部分会打印到小数点后6位。

这是使用格式化符号语言的格式说明,具体可以参考Java官方文档中的说明文档

你原来的代码中使用的是默认的toString()格式,具体可以参考Java官方文档中的说明文档

但是输出结果显示dexp: 12345681.000000,这是错误的值。实际上,我想将其显示在我的网页上,显示为1.2345678E7。是否有办法将其存储在一个double变量中,例如12345678,或者有其他方法吗?

可能你看到的是旧版本的答案,可以尝试重新加载页面。应该会有一个关于%.0f的段落。

你可以将dexp存储为int类型,这样可以方便地同时使用两种方式。

%.0f会对数字进行四舍五入。有没有一种方法只是舍弃尾部的零呢?

0