Як надрукувати поплавок з двома знаками після коми у 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.