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
Cần giải thích sự khác nhau của 2 phép chia
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.
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
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;
}
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
Vây tại sao khi i=0 thì “tien” lại nhỏ hơn 300tr?
bạn nói rõ hơn dc ko
tức là for(int I=0;;I++) ak
Ý 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 ạ?
tien+= tien8/100
=tien+tien8/100
thay số bấm zo máy tính biết liền
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é!
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
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.