Cần giải thích sự khác nhau của 2 phép chia

Tại sao bên có 8.0 (kiểu số thực) thì lại ra kết quả đúng, bên còn lại thì không?
Giải thích giúp em vì sao nó ra được kết quả như vậy?( Bên bị sai ấy)
THANKS

1 Like

Bên có 8.0 thì nó ép sang số thực nên tính đúng.
Bên kia không ép sang số thực nên tự làm tròn sang integer nên sai.

2 Likes

bên có 8.0 thì nó đổi kiểu tự đông qua kiểu số thực nên kết quả đúng
còn bên kia vẫn là số nguyên nên có thể tự làm tròn ko còn chính xác nữa :sweat_smile:

1 Like

Nhưng em thắc mắc là nếu chỉ sai về cách làm tròn số thì kết quả nó chắc cũng không chênh lệch nhiều lắm nhỉ? Nhưng cái code ấy nó ra kết quá khác hoàn toàn ngay từ dòng đầu tiên luôn ấy

Code em đây, mn xem thử:

#include <stdio.h>
#include <stdlib.h>

int main()
{   int tien1 = 300000000;
    int nam = 10;

    int tien = tien1;

     for(int i=0; i<nam; i++){
    tien +=  tien*8/100;

        printf("So tien nhan duoc sau %d nam la: %d\n",i+1, tien );}
        printf("So tien lai la: %d", tien-tien1 );


    return 0;
}
1 Like

nhân chia trước cộng trừ sau.
Tức là 8/100 trước ra 0 rùi + cho tien => sai số siêu lớn vì tien=300tr ra âm lun là phải :grinning:

1 Like

Vây tại sao khi i=0 thì “tien” lại nhỏ hơn 300tr?

1 Like

bạn nói rõ hơn dc ko

tức là for(int I=0;;I++) ak

1 Like

Ý em là khi em debug thì thấy là khi i=0( Vòng lặp) thì giá trị của “tien” lúc ấy là 281050328, tại sao lại như vậy ạ?

1 Like

tien+= tien8/100
=tien+tien
8/100
thay số bấm zo máy tính biết liền

1 Like

Thay số ntn để ra được con số 281050328 ấy? Em mới học nên chưa rõ lắm, anh thông cảm nhé!

2 Likes

tien=tien1=300000000
=>300000000+300000000*8/100
hết
cho anh link kết bạn trên face đi
anh đang học lập trình game nếu có thêm người theo c++ lập trình game thì vui và học sẽ nhah hơn cho cả 2.Anh sẽ jup e hết sức

1 Like

16 posts were merged into an existing topic: Topic lưu trữ các post off-topic - version 3

bạn dùng định dạng là %d để in ra kìa, nhẽ ra phải là %f nhé

Mình thấy các comment giải thích tại sao tính ra kết quả sai chưa làm rõ được nguyên nhân:

1. Phép toán tien*8/100 hay tien*8.0/100
đoạn này sẽ thực hiện từ trái sang phải, tức là tien*8 rồi mới chia 100, vậy nên không có chuyện thực hiện 8/100 trước.

2. Nguyên nhân trực tiếp dẫn đến kết quả sai là tràn số.
Biến tien đươc khai báo là integer (4byte), nên MAX chỉ đc 2,147,483,647, hơn 2,1 tỉ.
Nhưng theo code thì:
tien = 300.000.000 => tien * 8 = 2.400.000.000, tức 2,4 tỉ > MAX => Kết quả bị âm (bị tràn).

3. Vì sao 8.0 lại đúng.
Vì đoạn tính toán kia không bị tràn, sau khi tính đc hơn MAX thì lại bị chia 100 tiếp nên sau đó thì lại càng không bị tràn.

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