我想要的是一种将双精度转换为字符串的方法,该字符串使用半向上舍入方法进行舍入-即,如果要舍入的小数为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中实现这一点的最佳方法是什么?
public static double formatDecimal(double amount) {
BigDecimal amt = new BigDecimal(amount);
amt = amt.divide(new BigDecimal(1), 2, BigDecimal.ROUND_HALF_EVEN);
return amt.doubleValue();
}
使用Junit进行测试
@RunWith(Parameterized.class)
public class DecimalValueParameterizedTest {
@Parameterized.Parameter
public double amount;
@Parameterized.Parameter(1)
public double expectedValue;
@Parameterized.Parameters
public static List<Object[]> dataSets() {
return Arrays.asList(new Object[][]{
{1000.0, 1000.0},
{1000, 1000.0},
{1000.00000, 1000.0},
{1000.01, 1000.01},
{1000.1, 1000.10},
{1000.001, 1000.0},
{1000.005, 1000.0},
{1000.007, 1000.01},
{1000.999, 1001.0},
{1000.111, 1000.11}
});
}
@Test
public void testDecimalFormat() {
Assert.assertEquals(expectedValue, formatDecimal(amount), 0.00);
}