วิธีการพิมพ์ทศนิยมด้วยทศนิยม 2 ตำแหน่งใน Java?


คำตอบ:


250

คุณสามารถใช้printfวิธีการดังนี้:

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

กล่าวโดยย่อคือ%.2fไวยากรณ์บอกให้ Java คืนค่าตัวแปรของคุณ ( val) พร้อมทศนิยม 2 ตำแหน่ง ( .2) แทนทศนิยมของตัวเลขทศนิยม ( f) จากจุดเริ่มต้นของตัวระบุรูปแบบ ( %)

มีอักขระแปลงอื่น ๆ ที่คุณสามารถใช้นอกเหนือจากf:

  • d: จำนวนเต็มทศนิยม
  • o: จำนวนเต็มฐานแปด
  • e: floating-point ในเอกสารทางวิทยาศาสตร์

13
โปรดระวังเป็น String.format ขึ้นอยู่กับการกำหนดค่าปัจจุบันของคุณคุณอาจไม่ได้จุดเป็นตัวคั่น ชอบใช้String.format(java.util.Locale.US,"%.2f", val);
Gomino

1
@gomino ทำไมLocale.FRANCEล่ะ
erickson

3
@gomino แน่นอน เหตุใดคุณต้องใส่จุดในตัวเลขสำหรับผู้ใช้ภาษาฝรั่งเศส
erickson

1
ฉันได้เพิ่มความคิดเห็นนี้เพื่อเตือนผู้ที่คาดว่าจะมีจุดเป็นตัวคั่นเสมอ
Gomino

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)ไวยากรณ์ มันยังอยู่หรือเปล่า?
Anthony Forloney

6
มันคือ. มันยังเป็นตัวเลือก - คุณสามารถยกเลิกการลบคำตอบของคุณได้)
Bozho

ดูเหมือนว่าเป็นตัวเลือกของฉันเพราะฉันยังไม่รู้วิธีใช้ DecimalFormat :) ขอบคุณ!
via_point

ฉันยังไม่ได้ทำงานกับ Java อย่างกว้างขวางซักระยะและเมื่อฉันเห็นDecimalFormatคำตอบฉันคิดว่าฉันผิด แต่ขอบคุณที่ให้ความกระจ่าง
Anthony Forloney

9
เพิ่มdf.setMinimumFractionDigits(2);เพื่อบังคับสองหลัก
Terel

88

ฉันขอแนะนำให้ใช้String.format ()หากคุณต้องการค่าตามที่Stringในรหัสของคุณ

ตัวอย่างเช่นคุณสามารถใช้String.format()วิธีดังต่อไปนี้:

float myFloat = 2.001f;

String formattedString = String.format("%.02f", myFloat);

14
"% .02f" และ "% .2f" เหมือนกัน
Borzh

40
double d = 1.234567;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));

5
สวัสดีเควินถ้าป้อน 10.0000 ฉันได้รับ 10 เท่านั้น ถ้าฉันต้องการที่จะแสดง 10.00 แล้วฉันจะทำอย่างไร
Mdhar9e

2
@ Mdhar9e useDecimalFormat 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

DecimalFormatหลายคนได้กล่าวถึง แต่คุณสามารถใช้printfหากคุณมี Java เวอร์ชันล่าสุด:

System.out.printf("%1.2f", 3.14159D);

ดูเอกสารในฟอร์แมตสำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบของสตริง printf


9

เคล็ดลับง่ายๆคือการสร้างตัวแปรที่สั้นกว่าของคุณโดยการคูณด้วยเช่น100การปัดเศษและหารด้วย100.0อีกครั้ง วิธีนี้คุณสร้างตัวแปรโดยมีทศนิยม 2 ตำแหน่ง :

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

ด้านล่างเป็นรหัสวิธีที่คุณสามารถแสดงผลข้อมูลลอยด้วยทศนิยม 2 ตำแหน่งใน 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);
      }


 }

สำหรับรายละเอียดเพิ่มเติม: - makecodesimpleandeasy.blogspot.com/2019/08/…
ซอฟต์แวร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.