2016-08-18 3 views
0

Кто-нибудь знает, что я сделал неправильно здесь? Я получил число с плавающей точкой, допустим, это 0,04. После формата он превращается в 0.03. По-видимому, выходной результат уже на 0,01 меньше входного.DecimalFormat возвращает неверный результат

Вот мой код:

float creditAvailableProportion = this.accountSummary != null ? (this.accountSummary.getCreditAvailable()/this.accountSummary.getCreditLimit()) : 0; 
     DecimalFormat decimalFormat = new DecimalFormat("#.##"); 
     decimalFormat.setRoundingMode(RoundingMode.FLOOR); 
     float formattedCreditAvailableProportion = Float.parseFloat(decimalFormat.format(creditAvailableProportion)); 

     return Math.min(1.0f, formattedCreditAvailableProportion); 

Спасибо заранее.

+2

'System.out.println (decimalFormat.format (0.04));' prints' 0.04'; вы вызываете его с некоторым значением меньше, чем '0.04' (который будет * настил * до' 0.03'). –

+0

@ Long Можете ли вы показать нам, что значения 'this.accountSummary.getCreditAvailable()' и 'this.accountSummary.getCreditLimit()' - это то, что вы ожидаете, что их разделение составляет 0,04? – mapeters

+0

Не форматируйте его. Просто округлите его до 2 десятичных знаков. Вы должны быть в порядке. –

ответ

0

Как отлаживать это:

Выполнить этот код, он должен сделать вашу проблему ясно:

float creditAvailableProportion = this.accountSummary != null ? (this.accountSummary.getCreditAvailable()/this.accountSummary.getCreditLimit()) : 0; 
System.out.println(creditAvailableProportion)    //Original value 
DecimalFormat decimalFormat = new DecimalFormat("#.##"); 
decimalFormat.setRoundingMode(RoundingMode.FLOOR); 
String temp = decimalFormat.format(creditAvailableProportion); 
System.out.println(temp);          //formatted string 
float formattedCreditAvailableProportion = Float.parseFloat(decimalFormat.format(creditAvailableProportion)); 
System.out.println(formattedCreditAvailableProportion);   //Parsed float. 

return Math.min(1.0f, formattedCreditAvailableProportion); 

Будем надеяться, что это научит вас ловить рыбу немного.

+0

Я думаю, что из-за этого, но не уверен, почему: decimalFormat.setRoundingMode (RoundingMode.FLOOR); –

+0

Ну, какое значение было первым значением, у которого не было правильного номера? С моим кодом вы должны напечатать три значения. Кем они были? –

+0

temp имеет неправильное значение –

0

Также вы можете попробовать Math.floor(). Не использовать превращение его в строку, а что нет.

float temp = 7.888888f; 
temp = temp * 100; 
     temp = (float) Math.floor((double)temp); 
     temp = temp /100; 
     System.out.println(temp); 
2

Поскольку никто не объяснил проблему, позвольте мне вкратце объяснить, что происходит. Плавающие числа в большинстве систем, включая java, не являются точными. Это значит, что .04, внутренне хранится, например, как .03999999999 или .040000001 или что-то подобное. Поэтому, когда вы форматируете его в формате пола, вы можете получить 0,0. Решение состоит в использовании формата округления или добавлении .0000001 к значению перед форматированием. Таким образом, даже пол поможет.
Другой способ - по возможности сбрасывать плавающие числа и использовать целые числа (например, 1e6), аналогичные тому, что Android делает с геокоординатами.

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