การพิมพ์จำนวนทศนิยมที่ถูกต้องด้วย cout


133

ฉันมีรายการfloatค่าและฉันต้องการพิมพ์coutด้วยทศนิยม 2 ตำแหน่ง

ตัวอย่างเช่น:

10.900  should be printed as 10.90
1.000 should be printed as 1.00
122.345 should be printed as 122.34

ฉันจะทำสิ่งนี้ได้อย่างไร

( setprecisionดูเหมือนจะไม่ช่วยในเรื่องนี้)

คำตอบ:


196

ด้วย<iomanip>คุณสามารถใช้std::fixedและstd::setprecision

นี่คือตัวอย่าง

#include <iostream>
#include <iomanip>

int main()
{
    double d = 122.345;

    std::cout << std::fixed;
    std::cout << std::setprecision(2);
    std::cout << d;
}

และคุณจะได้รับผลผลิต

122.34

6
ทำไมคุณถึงใช้ "std: fixed" ในโปรแกรม?
Vilas Joshi

1
ส่วนหัวที่มีประโยชน์สามารถกำหนดได้สำหรับสิ่งนี้: #define FIXED_FLOAT(x) std::fixed <<std::setprecision(2)<<(x) ซึ่งทำให้การใช้งานง่ายขึ้น:cout<<FIXED_FLOAT(d)
Udayraj Deshmukh

13
@VilasJoshi, setprecision กำหนดจำนวนหลักหลังจุดทศนิยมถ้ามี 5 หลักและเราใช้ setprecision (2) เราจะได้รับ 2 หลัก แต่ถ้ามี 0 หลักมันจะแสดงไม่มีการใช้คงที่เราแก้ไขว่าตัวเลขมากมี จะแสดงดังนั้น 5 จะแสดงเป็น 5.00 no 5
vaibnak

43

คุณเกือบจะอยู่ที่นั่นแล้วต้องใช้ std :: fixed เช่นกันดูhttp://www.cplusplus.com/reference/iostream/manipulators/fixed/

#include <iostream>
#include <iomanip>

int main(int argc, char** argv)
{
    float testme[] = { 0.12345, 1.2345, 12.345, 123.45, 1234.5, 12345 };

    std::cout << std::setprecision(2) << std::fixed;

    for(int i = 0; i < 6; ++i)
    {
        std::cout << testme[i] << std::endl;
    }

    return 0;
}

เอาท์พุท:

0.12
1.23
12.35
123.45
1234.50
12345.00

18

setprecision(n)ใช้กับจำนวนทั้งหมดไม่ใช่ส่วนที่เป็นเศษส่วน คุณต้องใช้รูปแบบจุดคงที่เพื่อนำไปใช้กับส่วนที่เป็นเศษส่วน:setiosflags(ios::fixed)


12

ลดความซับซ้อนของคำตอบที่ยอมรับ

ตัวอย่างที่ง่าย:

#include <iostream>
#include <iomanip>

int main()
{
    double d = 122.345;
    std::cout << std::fixed << std::setprecision(2) << d;
}

และคุณจะได้รับผลผลิต

122.34

อ้างอิง:


สิ่งนี้ใช้ได้กับฉัน: std :: cout << std :: setprecision (2) << std :: fixed << d;
Andrea Girardi

5

ฉันมีปัญหาสำหรับจำนวนเต็มในขณะที่ต้องการจัดรูปแบบที่สอดคล้องกัน

เขียนใหม่เพื่อความสมบูรณ์:

#include <iostream>
#include <iomanip>

int main()
{
    //    floating point formatting example

    double d = 122.345;
    cout << std::fixed << std::setprecision(2) << d << endl;
    //    Output:  122.34


    //    integer formatting example

    int i = 122;
    cout << std::fixed << std::setprecision(2) << double(i) << endl;
    //    Output:  122.00
}

คุณขาด std :: ก่อนที่ cout และ endl เนื่องจากคุณไม่ได้ใช้ namespace
blackforest-tom

@ blackforest-tom - บางทีคุณพูดถูกไม่สามารถจำได้ --- โดยทั่วไปฉันมักจะคัดลอก - วางโปรแกรมทำงานดังนั้นสิ่งนี้อาจทำงานได้เหมือนใน Visual Studio หรือที่อื่น
Manohar Reddy Poreddy

3

ฉันมีปัญหาที่คล้ายกันนี้ในการแข่งขันการเข้ารหัสและนี่คือวิธีที่ฉันจัดการมัน การตั้งค่าความแม่นยำ 2 เป็นค่าสองเท่าทั้งหมด

ขั้นแรกให้เพิ่มส่วนหัวเพื่อใช้ setprecision

#include <iomanip>

จากนั้นเพิ่มรหัสต่อไปนี้ในหลักของเรา

  double answer=5.9999;
  double answer2=5.0000;
  cout<<setprecision(2)<<fixed;
  cout <<answer << endl;
  cout <<answer2 << endl;

เอาท์พุท:

5.99
5.00

คุณต้องใช้ค่าคงที่สำหรับการเขียน 5.00 นั่นเป็นสาเหตุว่าทำไมผลลัพธ์ของคุณจึงไม่มาที่ 5.00

ลิงค์วิดีโออ้างอิงสั้น ๆ ฉันกำลังเพิ่มซึ่งมีประโยชน์


2

คุณต้องตั้งค่า 'โหมดลอย' ให้คงที่

float num = 15.839;

// this will output 15.84
std::cout << std::fixed << "num = " << std::setprecision(2) << num << std::endl;

1

ในการตั้งค่าตัวเลข 2 หลักที่คงที่หลังจากจุดทศนิยมให้ใช้ก่อน:

cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);

จากนั้นพิมพ์ค่าสองเท่าของคุณ

นี่คือตัวอย่าง:

#include <iostream>
using std::cout;
using std::ios;
using std::endl;

int main(int argc, char *argv[]) {
    cout.setf(ios::fixed);
    cout.setf(ios::showpoint);
    cout.precision(2);
    double d = 10.90;
    cout << d << endl;
    return 0;
}


0

ด้วยแม่แบบ

#include <iostream>

// d = decimal places
template<int d> 
std::ostream& fixed(std::ostream& os){
    os.setf(std::ios_base::fixed, std::ios_base::floatfield); 
    os.precision(d); 
    return os; 
}

int main(){
    double d = 122.345;
    std::cout << fixed<2> << d;
}

คล้ายกับวิทยาศาสตร์เช่นกันพร้อมตัวเลือกความกว้าง (มีประโยชน์สำหรับคอลัมน์)

// d = decimal places
template<int d> 
std::ostream& f(std::ostream &os){
    os.setf(std::ios_base::fixed, std::ios_base::floatfield); 
    os.precision(d); 
    return os; 
}

// w = width, d = decimal places
template<int w, int d> 
std::ostream& f(std::ostream &os){
    os.setf(std::ios_base::fixed, std::ios_base::floatfield); 
    os.precision(d); 
    os.width(w);
    return os; 
}

// d = decimal places
template<int d> 
std::ostream& e(std::ostream &os){
    os.setf(std::ios_base::scientific, std::ios_base::floatfield); 
    os.precision(d); 
    return os; 
}

// w = width, d = decimal places
template<int w, int d> 
std::ostream& e(std::ostream &os){
    os.setf(std::ios_base::scientific, std::ios_base::floatfield); 
    os.precision(d); 
    os.width(w);
    return os; 
}

int main(){
    double d = 122.345;
    std::cout << f<10,2> << d << '\n'
        << e<10,2> << d << '\n';
}

-3

เพียงแค่จุดเล็กน้อย ใส่ต่อไปนี้ในส่วนหัว

ใช้ namespace std;

แล้วก็

std :: cout << std :: fixed << std :: setprecision (2) << d;

กลายเป็นเรื่องง่ายไป

ศาล << คงที่ << setprecision (2) << d;


2
ใช่มันกลายเป็น "ทำให้เข้าใจง่าย" แต่สิ่งนี้ก็เป็นกำลังใจอย่างยิ่ง โปรดอย่าใช้using namespace std;เพื่อประโยชน์ของมัน - เข้าใจว่าทำไมคุณถึงทำเช่นนั้น
Carlos F

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