Як надрукувати поплавок з двома знаками після коми у 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 Рівно. То чому б ви поставили крапки в цифрах для французьких користувачів?
— erickson

1
Я додав цей коментар як нагадування, щоб попередити людей, які сподіваються завжди мати крапку як роздільник.
— Гоміно

6
@gomino Це має сенс, але я думаю, що "віддати перевагу" жорсткому кодуванню Locale.USнадто далеко. Якщо вам потрібно жорстко зашифрувати "нейтральну" локаль для складання регістру, відображення номера тощо, вкажіть Locale.ROOT. Це було б доречно для тексту, який буде використовуватися іншою програмою, а не надаватись для користувачів. Для тексту, представленого користувачеві, вшановуйте його місцевість, незалежно від того, чи вказав він це явно чи це за замовчуванням.
— erickson

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);до сили дві цифри
— Терель

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");
— Ridhuvarshan

Точно! 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

ОК - str плавати.

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


 }

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.