Я считаю, что это тесно связано со следующим вопросом: Format double values using a maximum of five total digits, rounding decimal digits if necessary
Там есть ответ на вопрос, который я связан с которой использует MathContext
и BigDecimal
(как ответ maybeWeCouldStealAVan в). Однако это не совсем сработало для меня, потому что я заботился об общем количестве цифр. Однако это может сработать для вас.
В итоге я написал свое собственное решение, которое отформатировалось именно так, как мне было нужно. Возможно, это также отвечает вашим требованиям, или могут быть легко изменены, чтобы встретить их:
public static String format(double value, int totalDigits)
{
String s = String.valueOf(value);
int decimal = s.indexOf('.');
// there is no decimal part, so simply return the String
if (decimal == -1)
{
return s;
}
else
{
int finalLength;
// example: 23.34324
// the final result will be length totalDigits + 1 because we will include the decimal
if (decimal < totalDigits)
{
finalLength = totalDigits + 1;
}
// example: 99999
// the final result will be length totalDigits because there will be no decimal
else if (decimal == totalDigits)
{
finalLength = totalDigits;
}
// example: 999999.999
// we can't make the final length totalDigits because the integer portion is too large
else
{
finalLength = decimal;
}
finalLength = Math.min(s.length(), finalLength);
return s.substring(0, finalLength);
}
}
public static void main(String[] args)
{
double[] data = { 1, 100, 1000, 10000, 100000, 99999, 99999.99, 9999.99, 999.99, 23.34324, 0.111111 };
for (double d : data)
{
System.out.printf("Input: %10s \tOutput: %10s\n", Double.toString(d), format(d, 5));
}
}
[ 'java.text.DecimalFormat'] (http://docs.oracle.com/javase/ 6/документы/API/Java/текст/DecimalFormat.html) –