我想在 Java 中打印一个没有指数形式的双精度值。
double dexp = 12345678;
System.out.println("dexp: "+dexp);
它显示了这个 E 符号: 1.2345678E7
。
我希望它像这样打印: 12345678
防止这种情况的最佳方法是什么?
原文由 Despicable 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想在 Java 中打印一个没有指数形式的双精度值。
double dexp = 12345678;
System.out.println("dexp: "+dexp);
它显示了这个 E 符号: 1.2345678E7
。
我希望它像这样打印: 12345678
防止这种情况的最佳方法是什么?
原文由 Despicable 发布,翻译遵循 CC BY-SA 4.0 许可协议
将双精度数转换为普通数的五种不同方法:
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
这些都是相同的值。
提示:如果您对为什么这些随机数字在双精度值中出现超过某个阈值感到困惑,此视频解释了:computerphile why does 0.1
+ 0.2
equal 0.30000000000001
?
http://youtube.com/watch?v=PZRI1IfStY0
原文由 Eric Leschinski 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
您可以将
printf()
与%f
一起使用:这将打印
dexp: 12345678.000000
。如果您不想要小数部分,请使用%.0f
中的 0 表示小数部分有 0 个位置,即没有小数部分。如果您想打印具有所需小数位数的小数部分,那么只需提供这样的数字而不是 0%.8f
。默认情况下,小数部分最多打印 6 个小数位。这使用 文档 中解释的格式说明符语言。
原始代码中使用的默认
toString()
格式在 此处 详细说明。