Как напечатать с плавающей точкой с 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));

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

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


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);

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


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

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.