Как напечатать с плавающей точкой с 2 ​​десятичных знаков в Java?

Ответы:

250

Вы можете использовать printfметод, например так:

System.out.printf("%.2f", val);

Короче говоря, %.2fсинтаксис говорит Java возвращать вашу переменную ( val) с двумя десятичными знаками ( .2) в десятичном представлении числа с плавающей запятой ( f) от начала спецификатора формата ( %).

Есть и другие символы преобразования, которые вы можете использовать, кроме f:

  • d: десятичное целое
  • o: восьмеричное целое
  • e: с плавающей точкой в ​​научной нотации
Энтони Форлони
источник
13
Пожалуйста, будьте осторожны, так как String.format зависит от вашей текущей локальной конфигурации, вы не можете получить точку в качестве разделителя. Предпочитают использоватьString.format(java.util.Locale.US,"%.2f", val);
Gomino
1
@gomino Почему бы и нет Locale.FRANCE?
Эриксон
3
@gomino Точно. Так зачем ставить точки в цифрах для французских пользователей?
Эриксон
1
Я добавил этот комментарий как напоминание, чтобы предупредить людей, которые ожидают, что в качестве разделителя всегда будет точка.
Гомино
6
@gomino Это имеет смысл, но я думаю, что «предпочесть» жесткое кодирование Locale.USзаходит слишком далеко. Если вам нужно жестко закодировать «нейтральную» локаль для свертывания регистра, рендеринга чисел и т. Д., Укажите Locale.ROOT. Это подходит для текста, который будет использоваться другой программой, а не визуализирован для пользователей. Для текста, представляемого пользователю, учитывайте его языковой стандарт, независимо от того, указали ли они его явно или по умолчанию.
Эриксон
179

Вы можете использовать DecimalFormat. Один из способов его использования:

DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
System.out.println(df.format(decimalNumber));

Другой способ - построить его, используя #.##формат.

Я нахожу все параметры форматирования менее читабельными, чем вызов методов форматирования, но это вопрос предпочтений.

Bozho
источник
11
Что случилось с System.out.printf("%.2f", value)синтаксисом? Это все еще вокруг?
Энтони Форлони
6
это. это еще вариант - вы можете восстановить ответ;)
Божо
Похоже, это мой вариант, так как я еще не знаю, как использовать DecimalFormat :) Спасибо!
via_point
Я давно не занимался обширной работой на Java, и когда я продолжал видеть DecimalFormatответы, я сразу же подумал, что был неправ, но спасибо за разъяснение этого.
Энтони Форлони
9
добавить df.setMinimumFractionDigits(2);к силе две цифры
Terel
88

Я бы предложил использовать String.format (), если вам нужно значение какString в вашем коде.

Например, вы можете использовать String.format()следующим образом:

float myFloat = 2.001f;

String formattedString = String.format("%.02f", myFloat);
Джон П.
источник
14
«% .02f» и «% .2f» - это одно и то же
Борж
40
double d = 1.234567;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));
Кевин Сильвестр
источник
5
Привет, Кевин, если ввести 10.0000, я получаю только 10. Если я хочу отобразить 10.00, то как я могу это сделать?
Mdhar9e
2
@ Mdhar9e использоватьDecimalFormat df = new DecimalFormat("0.00");
K.Sopheak
16
float f = 102.236569f; 
DecimalFormat decimalFormat = new DecimalFormat("#.##");
float twoDigitsF = Float.valueOf(decimalFormat.format(f)); // output is 102.24
Фан Ван Линь
источник
4
В зависимости от региона вы можете получить запятую. Если вам нужен разделитель точек, используйте это: DecimalFormat ("#. ##", DecimalFormatSymbols (Locale.US))
DPM
10
float floatValue=22.34555f;
System.out.print(String.format("%.2f", floatValue));

Выход 22,35. Если вам нужно 3 десятичных знака, измените его на «% .3f».

Алдин Фило
источник
9

Простой трюк состоит в том, чтобы сгенерировать более короткую версию вашей переменной, умножив ее, например 100, на округление и деление на100.0 снова. Таким образом, вы генерируете переменную с двумя десятичными разрядами :

double new_variable = Math.round(old_variable*100) / 100.0;

Этот «дешевый трюк» всегда был достаточно хорош для меня и работает на любом языке (я не Java-человек, просто изучаю его).

Бирка
источник
1
Это неправильно, многие числа будут повторяться в представлении с плавающей запятой после того, как вы разделите их на 100. Следовательно, не два десятичных знака.
Мэтт
8

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

float y1 = 0.123456789;
DecimalFormat df = new DecimalFormat("#.00");  
y1 = Float.valueOf(df.format(y1));

Переменная y1 была равна 0.123456789 раньше. После кода он превращается только в 0,12 .

залив
источник
2
Он не отображает 0 перед точкой. Это должно быть DecimalFormat df = new DecimalFormat ("0.00");
Ридхуваршан
Для уверенности! DecimalFormat ("0.00") тоже будет работать! Отличное место.
Залив
6

Посмотрите на DecimalFormat

Вот пример из учебника:

  DecimalFormat myFormatter = new DecimalFormat(pattern);
  String output = myFormatter.format(value);
  System.out.println(value + "  " + pattern + "  " + output);

Если вы выберете шаблон типа "###. ##", вы получите два знака после запятой, и я думаю, что значения округлены. Вы захотите посмотреть на ссылку, чтобы получить точный формат, который вы хотите (например, хотите ли вы конечные нули)

Uri
источник
5

Ниже приведен код, как вы можете отобразить вывод данных с плавающей запятой с двумя десятичными разрядами в Java:

float ratingValue = 52.98929821f; 
DecimalFormat decimalFormat = new DecimalFormat("#.##");
float twoDigitsFR = Float.valueOf(decimalFormat.format(ratingValue)); // output is 52.98
Кешав Гера
источник
3

ОК - ул, чтобы отпустить.

package test;

import java.text.DecimalFormat;

public class TestPtz {
  public static void main(String[] args) {
    String preset0 = "0.09,0.20,0.09,0.07";
    String[] thisto = preset0.split(",");    
    float a = (Float.valueOf(thisto[0])).floatValue();
    System.out.println("[Original]: " + a);   
    a = (float) (a + 0.01);

    // Part 1 - for display / debug
    System.out.printf("[Local]: %.2f \n", a);
    // Part 2 - when value requires to be send as it is
    DecimalFormat df = new DecimalFormat();
    df.setMinimumFractionDigits(2);
    df.setMaximumFractionDigits(2);
    System.out.println("[Remote]: " + df.format(a));

  }
}

Вывод:

run:
[Original]: 0.09
[Local]: 0.10 
[Remote]: 0.10
BUILD SUCCESSFUL (total time: 0 seconds)

источник
1

Небольшая простая программа для демонстрации:

import java.io.*;
import java.util.Scanner;

public class twovalues {

    public static void main(String args[]) {

        float a,b;
        Scanner sc=new Scanner(System.in);
        System.out.println("Enter Values For Calculation");

        a=sc.nextFloat();
        b=sc.nextFloat();

        float c=a/b;
        System.out.printf("%.2f",c);
    }
}
Паван Вадреву
источник
1

Просто сделайте это, String str = System.out.printf("%.2f", val).replace(",", ".");если хотите убедиться, что независимо от языкового стандарта пользователя вы всегда получите / отобразите «.» в качестве десятичного разделителя. Это необходимо, если вы не хотите, чтобы ваша программа вылетала, если позже вы сделаете какое-то преобразование, напримерfloat f = Float.parseFloat(str);

Пол Эффорд
источник
1

Одна проблема, которая заставляла меня работать час или более DecimalFormat- она ​​по-разному обрабатывает двойные и плавающие вводы. Даже смена RoundingMode не помогла. Я не эксперт, но думал, что это может помочь кому-то, как я. Закончилось использованием Math.roundвместо. Увидеть ниже:

    DecimalFormat df = new DecimalFormat("#.##");
    double d = 0.7750;
    System.out.println(" Double 0.7750 -> " +Double.valueOf(df.format(d)));
    float f = 0.7750f;
    System.out.println(" Float 0.7750f -> "+Float.valueOf(df.format(f)));
    // change the RoundingMode
    df.setRoundingMode(RoundingMode.HALF_UP);
    System.out.println(" Rounding Up Double 0.7750 -> " +Double.valueOf(df.format(d)));
    System.out.println(" Rounding Up Float 0.7750f -> " +Float.valueOf(df.format(f)));

Вывод:

Double 0.7750 -> 0.78
Float 0.7750f -> 0.77

Rounding Up Double 0.7750 -> 0.78
Rounding Up Float 0.7750f -> 0.77
user2984447
источник
0

Попробуй это:-

private static String getDecimalFormat(double value) {

    String getValue = String.valueOf(value).split("[.]")[1];

      if (getValue.length() == 1) {
          return String.valueOf(value).split("[.]")[0] +
                "."+ getValue.substring(0, 1) + 
                String.format("%0"+1+"d", 0);
       } else {
          return String.valueOf(value).split("[.]")[0]
            +"." + getValue.substring(0, 2);
      }


 }
Натани Программное обеспечение
источник
Для более подробной информации: - makecodesimpleandeasy.blogspot.com/2019/08/...
Nathani Software