java 中的双数字格式
Double number formatting in java
我正在Java开发一个计算器程序,我需要显示一个长度不超过15位数字(包括小数点)的数字。
我尝试使用 String.format("%g", myDouble)
和 %f
格式化此数字,但无法获得我正在寻找的结果。
问题是我需要号码:
- 15位以上显示为科学计数法,
- 或小于15位不四舍五入显示
此外,我不希望小数点前后有任何固定位数。
有什么建议吗?
这是显示我的号码的代码片段:
if (("" + myDouble).length() > 15) {
screen.setText(String.format("%g", myDouble));
} else {
screen.setText("" + myDouble);
}
一个问题是当执行else
子句时,有时数字会显示为9.0000E7
,这是不利的并且不同于看起来像String.format("%g", myDouble)
的科学记数法更像是 9.000e+7
.
只需使用 NumberFormat
对象。有关详细信息,请参阅 the javadoc。
NumberFormat formatter = new DecimalFormat();
if (("" + myDouble).length() > 15) {
formatter = new DecimalFormat("0.######E0");
screen.setText(formatter.format(myDouble));
} else {
formatter = new DecimalFormat("#");
screen.setText(formatter.format(myDouble));
}
这似乎接近您的要求:
static String format(double n) {
if(Double.isInfinite(n) || Double.isNaN(n))
return Double.toString(n);
String result = BigDecimal.valueOf(n).toPlainString();
if(result.length() > 15)
result = String.format("%.15e", n);
return result;
}
由于您的要求是小数位 不是 固定的,所以我真的没有办法只使用格式化程序来做到这一点。
如果您想要科学记数法的特定位数,那么您可以使用类似 "%.15e"
的格式,其中 15
是您想要的小数位数。
或者您可能想要这样的东西:
if(result.length() > 15)
result = new DecimalFormat("0.###############E0").format(n);
但是如果你试图 "block align" 到某个最大值,那么事情就会变得复杂,因为小数位数取决于指数中的位数。
我正在Java开发一个计算器程序,我需要显示一个长度不超过15位数字(包括小数点)的数字。
我尝试使用 String.format("%g", myDouble)
和 %f
格式化此数字,但无法获得我正在寻找的结果。
问题是我需要号码:
- 15位以上显示为科学计数法,
- 或小于15位不四舍五入显示
此外,我不希望小数点前后有任何固定位数。
有什么建议吗?
这是显示我的号码的代码片段:
if (("" + myDouble).length() > 15) {
screen.setText(String.format("%g", myDouble));
} else {
screen.setText("" + myDouble);
}
一个问题是当执行else
子句时,有时数字会显示为9.0000E7
,这是不利的并且不同于看起来像String.format("%g", myDouble)
的科学记数法更像是 9.000e+7
.
只需使用 NumberFormat
对象。有关详细信息,请参阅 the javadoc。
NumberFormat formatter = new DecimalFormat();
if (("" + myDouble).length() > 15) {
formatter = new DecimalFormat("0.######E0");
screen.setText(formatter.format(myDouble));
} else {
formatter = new DecimalFormat("#");
screen.setText(formatter.format(myDouble));
}
这似乎接近您的要求:
static String format(double n) {
if(Double.isInfinite(n) || Double.isNaN(n))
return Double.toString(n);
String result = BigDecimal.valueOf(n).toPlainString();
if(result.length() > 15)
result = String.format("%.15e", n);
return result;
}
由于您的要求是小数位 不是 固定的,所以我真的没有办法只使用格式化程序来做到这一点。
如果您想要科学记数法的特定位数,那么您可以使用类似 "%.15e"
的格式,其中 15
是您想要的小数位数。
或者您可能想要这样的东西:
if(result.length() > 15)
result = new DecimalFormat("0.###############E0").format(n);
但是如果你试图 "block align" 到某个最大值,那么事情就会变得复杂,因为小数位数取决于指数中的位数。