2012-04-22 3 views
2

Я хотел бы отформатировать несколько двойных значений до определенного количества цифр, игнорируя начальные нули.Формат Java от двух до определенного числа цифр, игнорирующих нуль

Пример, позволяет сказать, что формат 6 цифр:

131.468627436358 -> 131.469 
3.16227766016838 -> 3.16228 
0.66018099039325 -> 0.660181 
0.02236067977499 -> 0.0223607 
+5

[ 'java.text.DecimalFormat'] (http://docs.oracle.com/javase/ 6/документы/API/Java/текст/DecimalFormat.html) –

ответ

3

BigDecimal позволяет обработку значительных фигур правильно. Это:

MathContext round3SigFig = new MathContext(3,RoundingMode.HALF_UP); 
System.out.println((new BigDecimal(0.000923874932)).round(round3SigFig)); 

производит:

0.000924 

Очевидно, однако, пролетая мимо плавающие точки, через произвольное представление точности объекта не является идеальным.

0

Рассмотрите это как вариант с последним шансом: как насчет преобразования числа в строку, взяв первые шесть цифр, имея в виду «,» и переходя обратно в двойное.

0

Я считаю, что это тесно связано со следующим вопросом: 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)); 
    } 
} 
0

Используйте логарифмические функции для вычисления числа дополнительных цифр, которые необходимо.

public static int leadingZeros (double d) { 
    return (d >= 1.0) ? 0 : (int) (-1 * (Math.floor (Math.log (d)/Math.log (10)))); 
} 

Для

System.out.println (leadingZeros (4)); 
    System.out.println (leadingZeros (0.4)); 
    System.out.println (leadingZeros (0.04)); 
    System.out.println (leadingZeros (0.004)); 

это вернуть 0, 1, 2, 3.

Смежные вопросы