我想要的是一种将双精度转换为字符串的方法,该字符串使用半向上舍入方法进行舍入-即,如果要舍入的小数为5,则始终向上舍入到下一个数字。这是大多数人在大多数情况下所期望的四舍五入的标准方法。

我还希望只显示有效数字,即不应有任何尾随零。

我知道这样做的一种方法是使用String.format方法:

String.format("%.5g%n", 0.912385);

返回:

0.91239

这是很好的,但是它总是显示带有5位小数的数字,即使它们不重要:

String.format("%.5g%n", 0.912300);

返回:

0.91230

另一种方法是使用DecimalFormatter:

DecimalFormat df = new DecimalFormat("#.#####");
df.format(0.912385);

返回:

0.91238

然而,正如您所见,这使用了半偶数舍入。也就是说,如果前一个数字是偶数,它将向下舍入。我想要的是:

0.912385 -> 0.91239
0.912300 -> 0.9123

在Java中实现这一点的最佳方法是什么?


当前回答

Real的Java How to发布了这个解决方案,它也与Java 1.6之前的版本兼容。

BigDecimal bd = new BigDecimal(Double.toString(d));
bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
return bd.doubleValue();

UPDATE:BigDecimal.ROUND_HALF_UP已弃用-使用舍入模式

BigDecimal bd = new BigDecimal(Double.toString(number));
bd = bd.setScale(decimalPlaces, RoundingMode.HALF_UP);
return bd.doubleValue();

其他回答

您也可以使用

DecimalFormat df = new DecimalFormat("#.00000");
df.format(0.912385);

以确保后面有0。

请记住,String.format()和DecimalFormat使用默认Locale生成字符串。因此,他们可以用点或逗号作为整数和小数部分之间的分隔符来编写格式化的数字。要确保舍入字符串的格式为所需的格式,请按如下方式使用java.text.NumberFormat:

  Locale locale = Locale.ENGLISH;
  NumberFormat nf = NumberFormat.getNumberInstance(locale);
  // for trailing zeros:
  nf.setMinimumFractionDigits(2);
  // round to 2 digits:
  nf.setMaximumFractionDigits(2);

  System.out.println(nf.format(.99));
  System.out.println(nf.format(123.567));
  System.out.println(nf.format(123.0));

将以英语语言环境打印(无论您的语言环境如何):0.99123.57123

示例取自Farenda-如何正确地将double转换为String。

假设值是双倍的,您可以执行以下操作:

(double)Math.round(value * 100000d) / 100000d

这是5位数精度。零的数量表示小数的数量。

这是我发现的只显示两位小数的最简单方法。

double x = 123.123;
System.out.printf( "%.2f", x );

如果您希望结果为字符串,可以使用以下内容:

DecimalFormat#setRoundingMode():DecimalFormat df=新的DecimalFormat(“#.#####”);df.setRoundingMode(RoundingMode.HALF_UP);字符串str1=df.format(0.912385));//0.91239BigDecimal#setScale()字符串str2=新BigDecimal(0.912385).setScale(5,BigDecimal.ROUND_HALF_UP).toString();

这里有一个建议,如果你想要加倍,你可以使用哪些库。不过,我不建议将其用于字符串转换,因为double可能无法准确表示您想要的内容(请参见此处的示例):

Apache Commons数学中的精度双舍入=精度舍入(0.912385,5,BigDecimal.round_HALF_UP);Colt函数双舍入=函数。舍入(0.00001)。应用(0.912385)来自Weka的Utilsdoubleround=Utils.roundDouble(0.912385,5)