2013-12-09 3 views
5

Я пытаюсь держать двух знаков после запятой, даже если то цифры равны нулю, используя DecimalFormatter:Java - всегда держать два знака после запятой даже в нулях

DecimalFormat df = new DecimalFormat("#.00"); 

m_interest = Double.valueOf(df.format(m_principal * m_interestRate)); 
m_newBalance = Double.valueOf(df.format(m_principal + m_interest - m_payment)); 
m_principal = Double.valueOf(df.format(m_newBalance)); 

Однако для некоторых значений это дает два знака после запятой, и для других это не так. Как я могу это исправить?

+0

Можете ли вы привести пример, который не работает? – SudoRahul

+1

Вы уверены? Я бы использовал «# 0.00» для моего формата String, но это должно и будет работать. Я должен задаться вопросом, действительно ли вы используете код, который вы показываете выше. –

+0

Возможно, потому что вы делаете 'Double.valueOf'. Впрочем, догадайтесь. –

ответ

4

Это потому, что вы используете Double.valueOf на DecimalFormat и преобразуете отформатированное число обратно в двойное, поэтому исключая завершающие 0s.

Чтобы исправить это, используйте только DecimalFormat когда вы отображающее значения.

Если вам нужны расчеты m_interest, сохраните его как обычный double.

Тогда при отображении, использование:

System.out.print(df.format(m_interest)); 

Пример:

DecimalFormat df = new DecimalFormat("#.00"); 
double m_interest = 1000; 
System.out.print(df.format(m_interest)); // prints 1000.00 
+0

Но мне нужно отправить значение как двойное. Здесь вывод df.format() имеет строковый тип. Могу ли я как-то отправить двойное значение как 10.00, вместо 10.0? Или я вообще не могу? –

+0

@ChandraBhanSingh Это не имеет смысла. Двойной - числовое значение; он не отформатирован, чтобы иметь завершающие нули. Если вам нужно каким-то образом напечатать номер, используйте 'df.format()' перед этим. Помимо печати номера, вы можете просто оставить его как десятичное. Какая ситуация для вас? –

+0

В моем проекте мы подписали документ, в котором явно указано, что двойное значение будет неточным. Теперь клиент похож, что мы хотим, чтобы эти 4 нуля после десятичных точек, я действительно смущен, как этого достичь. Цените, если вы можете сказать мне какие-то броские заявления, поэтому я могу убедить его в этом. Я отправляю эти значения через веб-сервис JAX-WS. –

2

Используйте BigDecimal вместо этого, который поддерживает подход к форматированию, который вы ищете. Подробности его

Этот вопрос: How to print formatted BigDecimal values?

+1

У него накладные расходы? Что бы это было? Если вы делаете деньги, BigDecimal - это то, как вы это делаете. – Rob

+1

Извините, вы правы. Все финансовые расчеты должны выполняться с помощью BigDecimal. Я отменяю свой предыдущий комментарий. Опять же, извините. 1+ –

+1

, как указывает @Rob, используйте BigDecimal, не столько из-за имеющегося форматирования, сколько потому, что он использует бесконечную точность, а Double будет подвержен округлению, что будет нежелательным для денежных расчетов. – GreyBeardedGeek

3

DecimalFormat и NumberFormat должны работать нормально. Экземпляр валюта могла бы работать еще лучше :

import java.text.DecimalFormat; 
import java.text.NumberFormat; 

public class Foo { 
    public static void main(String[] args) { 
     DecimalFormat df = new DecimalFormat("#0.00"); 

     NumberFormat nf = NumberFormat.getInstance(); 
     nf.setMinimumFractionDigits(2); 
     nf.setMaximumFractionDigits(2); 

     NumberFormat cf = NumberFormat.getCurrencyInstance(); 

     System.out.printf("0 with df is: %s%n", df.format(0)); 
     System.out.printf("0 with nf is: %s%n", nf.format(0)); 
     System.out.printf("0 with cf is: %s%n", cf.format(0)); 
     System.out.println(); 
     System.out.printf("12345678.3843 with df is: %s%n", 
      df.format(12345678.3843)); 
     System.out.printf("12345678.3843 with nf is: %s%n", 
      nf.format(12345678.3843)); 
     System.out.printf("12345678.3843 with cf is: %s%n", 
      cf.format(12345678.3843)); 
    } 
} 

Это выведет:

0 with df is: 0.00 
0 with nf is: 0.00 
0 with cf is: $0.00 

12345678.3843 with df is: 12345678.38 
12345678.3843 with nf is: 12,345,678.38 
12345678.3843 with cf is: $12,345,678.38 
-1

Почему вы не просто Math.round (значение * 100)/100.0?

+0

Это именно то, что его проблема. Ему нужно, чтобы он показывал конечные 0. Округление их устранит. Это тоже не ответ, это вопрос, поэтому должен быть комментарий. –

+0

Извините, я не думаю, что Двойной.valueOf() заботится об этих 0s, таким образом, я думаю, что это чрезмерная проблема, связанная с форматированием. – pinxue

+0

Да, проблема 'Double.valueOf()' является его проблемой. Это то, что мы пытаемся исправить для него. Пожалуйста, прочитайте его вопрос. –

0
m_interest = Double.valueOf(String.format("%.2f", sum)); 
+2

Хотя этот код может ответить на вопрос, было бы лучше объяснить _how_, он решает проблему, не вводя других и _why_ использовать ее. Ответы только на код не полезны в долгосрочной перспективе. –

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