2012-05-04 4 views
1

Я обрезаю float здесь. Но мое значение округляется. Я не хочу этого. Если мое значение 12.989 ->, оно должно быть напечатано только как 12.98. Может кто-то помочь Я не могу использовать SetRoundingMode десятичного формата, потому что это поддерживается только с помощью java 1.6. Шахта - 1.5 JDK. CAn кто-то помогает мне без использования метода SetRoundingMode() ????Усечение плавающего значения без использования SetRoundingMode()

 String pattern = "##,##0.00";   
     NumberFormat nf = NumberFormat.getNumberInstance(); 
     DecimalFormat df = (DecimalFormat)nf;  

     double fPart; 
     Float value=233.989f; 
     String dstr = String.valueOf(value); 
     dstr = dstr.substring(dstr.indexOf(".")+1); 
     Long db = Long.valueOf(dstr); 
     if(db > 0){ 
      df.applyPattern(pattern); 
      System.out.println("input="+value+", fPart="+dstr); 
     }   

     String output = df.format(value); 

    System.out.println(output); 

ответ

-1

Вы можете использовать регулярные выражения, чтобы получить вторую цифру после "." а затем вычтите строку от начала до этой позиции, а затем преобразуйте строку в поплавок или двойной.

Pattern pattern = Pattern.compile("regular expression"); 
Matcher matcher = pattern.matcher("your string"); 

if(matcher.find()) 
{ 
    int poz_begin = matcher.start(); 
    int poz_end = matcher.end(); 
} 
+0

на NoEs, а не регулярные выражения. – unbeli

0

Не уверен, если я понял, что вы проблема соответствия. Но если вы хотите укоротить без округления вверх или вниз, вы можете использовать так же, как DecimalFormat df = new DecimalFormat("##.##"); df.format(12.912385);

+0

Будет округлено .... попробуйте некоторые значения разности – Azfar

+0

Yup .. Выше старой школы трюк хороший .. –

2

Вы всегда можете использовать старый школьный трюк, умножить на 10^п, усечение, разделите на 10^п:

float x = 233.989f; 
x = (float)(Math.floor(x * 100)/100); 

Я также экспериментировал с BigDecimal:

MathContext mc = new MathContext(5, RoundingMode.FLOOR) 
BigDecimal decimal = new BigDecimal(233.989, mc); 
System.out.println(decimal); 

Это делает работу, но вы должны указать общее количество цифр. Вы не можете просто сказать, что я хочу 2 десятичных разряда, и мне не нужны цифры слева от десятичной точки. Таким образом, первый параметр MathContext равен 5, а не 2. Если вы выберете этот подход, вы можете быстро вычислить не десятичные цифры с Math.Ceil(Math.log10(x)).

Примечание:

  • При делении (первый подход), по крайней мере один из операндов должен быть с плавающей точкой (с плавающей точкой или двойной)
  • При работе со строками (вы код), это не безопасно предположить, что '' десятичный разделитель
  • усечения десятичные с Math.floor работает только для положительных значений
+0

BigDecimal путь хороший. +1 – unbeli

+0

это хорошо, только когда вы знаете числа, входящие. – Azfar

+0

Что делать, если вы не знаете, что такое цифры и вы хотите достичь шаблона? – Azfar

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