Kiểu double nhưng không hiển thị số thập phân

Chào mọi người, cho mình hỏi tại sao cái q có kiểu double mà nó lại làm tròn lên chứ không để số thập phân vậy ạ

 #include <iostream>
 #include <math.h>
 #include <iomanip>
 using namespace std;
 void Nhap(int[]);
 void Dientich(int[], double[], int);
 bool Kiemtra(int[]);
 void Xuat(double[], int);
 int main()
 {
     int a[3], stt = 0, n;
     double b[1000];
     cin >> n;
     for (int i = 0; i < n; i++){
         Nhap(a);
         if(Kiemtra(a)) Dientich(a, b, stt);
         else b[stt] = 0;
         stt++;
     }
     Xuat(b, n);
 }
 void Nhap(int a[])
 {
     for(int i = 0; i < 3; i++){
         cin >> a[i];
     }
 }
 void Dientich(int a[], double b[], int stt){
     double q = (a[0]+a[1]+a[2])/2; // bộ thử 401 495 757 => q = 826.5 nhưng nó làm tròn 826
     b[stt] = sqrt(q*(q-a[0])*(q-a[1])*(q-a[2]));
 }
 bool Kiemtra(int a[]){
     if(a[0] >= a[1] + a[2] || a[1] >= a[0] + a[2] || a[2] >= a[0] + a[1]) return false;
     return true;
 }
 void Xuat(double b[], int n){
    for (int i = 0; i < n; i++){
         if(b[i] != 0) cout << setprecision(5) << fixed << b[i] << endl;
         else cout << setprecision(5) << fixed << "NOT TRIANGLE" << endl;
     }
 }

Các dữ liệu bên trái toàn int thì kết quả của nó sẽ là int.
Sau đó nó mới chuyển sang double thì sao mà có sau dấu phẩy được.

2 Likes

Mình thử 376 524 210 nó ra số thập phân bth mà

Tổng chẵn thì đương nhiên ra đúng mà :smiley:

Ba số int cộng lại là int, và số 2 cũng là int.

3 Likes

cảm ơn, giờ mới nhớ ra :v

Mình sửa bài cho bạn rồi, tự nhấn vào nút chỉnh sửa và xem mình sửa ra sao, để lần sau đăng mã cho đúng.

Vấn đề của bạn:
Do bạn cộng và chia các số nguyên nên kết quả trước khi ép về double là số nguyên, mà số nguyên thì không có phần thập phân, sau đó khi gán sẽ được ép về double.

Diễn tả sơ lược thế này cho bạn hiểu nhé:

double result = (100 + 99 + 98) / 2; // tất cả các số hạng đều là số nguyên

Tương đương với:

double result;
int temp_result = (100 + 99 + 98) / 2;
/*
= 297 / 2
= 148 // phép chia 2 số nguyên thì kết quả sẽ lấy phần nguyên, bỏ qua phần thập phân.
*/
result = (double) temp_result; // 148

Diễn giải đầy đủ phải là:

int temp1 = 100 + 99; // 199
int temp2 = temp1 + 98; // 297
int temp3 = temp2 / 2; // 148

Vậy cách giải quyết?
Ép 1 toán hạng bất kì sang double trước khi tính toán. Nên ép toán hạng có ưu tiên cao nhất. Theo ví dụ thì đó là 100.
Kiểu của giá trị sẽ phụ thuộc vào kiểu bao quát hơn,
VD: khi cộng 2 số kiểu double + int thì kiểu của tổng sẽ là kiểu double.

double result = ((double)100 + 99 + 98) / 2;
// hoặc
double result = (100.0 + 99 + 98) / 2;
double temp1 = 100.0 + 99; // 199.0
double temp2 = temp1 + 98; // 297.0
double temp3 = temp2 / 2;  // 148.5
4 Likes

@SITUVN.gcd Mình cảm ơn nhiều

Nếu nó ra được thập phân thì khuyên bạn bỏ trình biên dịch, ide đó đi :+1:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?