Mencetak jumlah titik desimal yang benar dengan cout


133

Saya memiliki daftar floatnilai dan saya ingin mencetaknya coutdengan 2 tempat desimal.

Sebagai contoh:

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

Bagaimana saya bisa melakukan ini?

( setprecisionSepertinya tidak membantu dalam hal ini.)

Jawaban:


196

Dengan <iomanip>, Anda dapat menggunakan std::fixeddanstd::setprecision

Berikut ini sebuah contoh

#include <iostream>
#include <iomanip>

int main()
{
    double d = 122.345;

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

Dan Anda akan mendapatkan output

122.34

6
mengapa Anda menggunakan "std: fix" dalam program?
Vilas Joshi

1
Header yang berguna dapat didefinisikan untuk ini: #define FIXED_FLOAT(x) std::fixed <<std::setprecision(2)<<(x) yang menyederhanakan penggunaan untuk:cout<<FIXED_FLOAT(d)
Udayraj Deshmukh

13
@VilasJoshi, setprecision mengatur jumlah digit setelah desimal, jika ada 5 digit dan kami menggunakan setprecision (2) kita akan mendapatkan 2 digit, tetapi jika ada 0 digit itu tidak akan menunjukkan apa-apa, menggunakan perbaikan kami memperbaiki bahwa banyak digit memiliki untuk ditampilkan sehingga 5 akan diwakili sebagai 5.00 no 5
vaibnak

43

Anda hampir sampai, perlu menggunakan std :: diperbaiki juga, lihat 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;
}

output:

0.12
1.23
12.35
123.45
1234.50
12345.00

18

setprecision(n)berlaku untuk seluruh nomor, bukan bagian pecahan. Anda perlu menggunakan format titik tetap untuk membuatnya berlaku untuk bagian fraksional:setiosflags(ios::fixed)


12

Sederhanakan jawaban yang diterima

Contoh sederhana:

#include <iostream>
#include <iomanip>

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

Dan Anda akan mendapatkan output

122.34

Referensi:


Ini bekerja untuk saya: std :: cout << std :: setprecision (2) << std :: fixed << d;
Andrea Girardi

5

Saya punya masalah untuk bilangan bulat sambil menginginkan pemformatan yang konsisten.

Menulis ulang untuk kelengkapan:

#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
}

Anda kehilangan std :: tepat sebelum cout dan endl karena Anda tidak menggunakan namespace.
blackforest-tom

@ blackforest-tom - Mungkin Anda benar, tidak dapat mengingat --- Saya biasanya menyalin-menempel program kerja, jadi ini mungkin berjalan seperti apa adanya di Visual Studio atau di tempat lain.
Manohar Reddy Poreddy

3

Saya memiliki masalah serupa dalam kompetisi coding dan ini adalah bagaimana saya menanganinya. Mengatur ketelitian 2 untuk semua nilai ganda

Pertama menambahkan header untuk menggunakan setprecision

#include <iomanip>

Kemudian tambahkan kode berikut di utama kami

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

Keluaran:

5.99
5.00

Anda harus menggunakan tetap untuk menulis 5,00 itulah sebabnya, output Anda tidak akan datang untuk 5,00.

Tautan video referensi pendek yang saya tambahkan sangat membantu


2

Anda harus mengatur 'mode float' untuk diperbaiki.

float num = 15.839;

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

1

Untuk menetapkan 2 digit tetap setelah titik desimal gunakan yang pertama:

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

Kemudian cetak nilai ganda Anda.

Ini adalah sebuah contoh:

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

1
#include<stdio.h>
int main()

{

 double d=15.6464545347;

printf("%0.2lf",d);

}

0

dengan templat

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

mirip untuk ilmiah juga, dengan opsi lebar juga (berguna untuk kolom)

// 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

Hanya titik kecil; letakkan yang berikut di header

menggunakan namespace std;

kemudian

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

menjadi disederhanakan menjadi

cout << diperbaiki << setprecision (2) << d;


2
Ya, itu memang menjadi "disederhanakan", tetapi ini sangat tidak dianjurkan. Tolong jangan gunakan using namespace std;untuk kepentingan itu - pahami mengapa Anda melakukannya.
Carlos F

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.