Форматирование значений с плавающей запятой в Java [дубликаты]

1

Я попытался использовать это:

String t="4.99999999";
t = String.format("%.2f",Float.valueOf(t));

Я хотел, чтобы он печатал 4.99, но написал 5.00. Ты знаешь почему?

Теги:

4 ответа

3
Лучший ответ

Здесь есть две проблемы. Один из них заключается в том, что float не может различать между 4.99999999 и 5.0, то есть Float.valueOf() анализирует его как 5.0. У партией достаточно высокой точности. Другая проблема заключается в том, что 5.0 - правильное поведение для %2f. Вы запрашиваете две десятичные точки, а 4.99999999 явно округляется до 5,00. Поскольку поведение String.format() не то, что вы хотите, что вы хотите, то есть почему 4,99 правильное поведение для вашего случая использования?

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

1

В общем случае вы не должны использовать float (или double), когда думаете о десятичных числах.

Простой пример:

System.out.println(0.33333333333333333 + 0.1);

будет печатать:

0.43333333333333335

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

Если вы хотите обрабатывать десятичные числа, вы должны использовать BigDecimal или аналогичный класс.

Пример использования этого:

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

public class Snippet {

    public static void main(String[] args) {

        // define the value as a decimal number
        BigDecimal value = new BigDecimal("4.99999999");

        // round the decimal number to 2 digits after the decimal separator
        // using the rounding mode, that just chops off any other decimal places
        value.setScale(2, RoundingMode.DOWN);

        // define a format, that numbers should be displayed like
        DecimalFormat format = new DecimalFormat("#.00");

        // use the format to transform the value into a string
        String stringRepresentation = format.format(value);

        // print string
        System.out.println(stringRepresentation);
    }
}
1

Если вы хотите, чтобы он показывал 4.99 почему вы не извлекаете подстроку

String t="4.99999999";
int i =  t.indexOf('.');
if(i != -1){
    t = t.substring(0, Math.min(i + 3, t.length()));
}

Если вы хотите, чтобы он всегда имел два десятичных знака, вы используете BigDecimal. С BigDecimal вы можете установить масштаб до 2 знаков после запятой и округлить так, чтобы числа, такие как 4 выходили из 4.00

 String t="4";
 BigDecimal bd = new BigDecimal(t).setScale(2, BigDecimal.ROUND_DOWN);
 System.out.println(bd); //prints out 4.00
  • 0
    Хорошо попробую
  • 0
    @ user3160197 это не имеет значения, это всегда будет работать. Поиск десятичной точки является линейным.
Показать ещё 3 комментария
0

Пытаться

System.out.println(((int)(Float.valueOf(t) * 100))/100.0);
  • 0
    но я хочу, чтобы это работало также, если номер 2342323.23423423421897
  • 0
    Затем используйте log10, чтобы найти число k старших цифр и pow (10, k + 2) вместо 100 в примере.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню