Cách so sánh float nhận giá trị đúng nhất

System.out.println("Nhap a = ");
float a = scanner.nextFloat();
 if( a >= 10 ){
       System.out.println("Nhan gia tri a");
}
else
     System.out.println("Khong nhan gia tri a");

Ở đoạn code trên, khi em nhập 9 nó sẽ báo “không nhận giá trị a” nhưng khi em nhập 9.999999999999999 nó sẽ báo “nhận giá trị a”, có cách nào để mà khi em nhập 9.999999999999999 nó báo “không nhận giá trị a” không ạ?

Bạn phải tự đọc số thôi.

4 Likes
if(Math.Abs(a-10) < 0.0001){ // 0.0001 là độ chính xác
}
else{
}

Hoặc đại loại như vậy.

3 Likes

Hello Dũng,

Điều này xảy ra do số thập phân khi biểu diễn dưới dạng float sẽ bị làm tròn và không chính xác. Vì vậy, khi bạn nhập giá trị 9.999999999999999, thực chất giá trị đó sẽ được làm tròn và biểu diễn là 10. Do đó, nó sẽ được chấp nhận trong điều kiện “a >= 10”.

Để giải quyết vấn đề này, bạn nên sử dụng kiểu dữ liệu double thay cho float để giữ cho giá trị thập phân được biểu diễn chính xác hơn. Và bạn có thể sử dụng một số phương pháp để so sánh hai số thực như chuyển đổi sang dạng số nguyên hoặc so sánh với một giá trị rất nhỏ như 0.000001 để xem hai số thực có bằng nhau không.

Ví dụ, bạn có thể sửa mã của mình như sau để sử dụng double và so sánh với một giá trị rất nhỏ để xác định xem giá trị của “a” có bé hơn 10 hay không:

System.out.println("Nhap a = ");
double a = scanner.nextDouble();
if (Math.abs(a - 10) < 0.000001) {
    System.out.println("Khong nhan gia tri a");
} else if (a >= 10) {
    System.out.println("Nhan gia tri a");
} else {
    System.out.println("Khong nhan gia tri a");
}

Trong đó, phương thức Math.abs(a - 10) sẽ trả về giá trị tuyệt đối của sự khác biệt giữa a và 10, và so sánh kết quả với một giá trị rất nhỏ để xác định xem giá trị của “a” có bé hơn 10 hay không.

Chúc bạn lập trình vui vẻ.

3 Likes

Đây là điều kiện so sánh xem a có bằng 10 hay không. Ở đây bạn thớt muốn a >= 10 thì nhận giá trị a, code của bạn @HanQuaNhanh đang không đáp ứng được yêu cầu đề bài.

Bạn chủ thớt sửa điều kiện so sánh một chút là được:

public static final double EPSILON = 1e-6; // tuỳ bạn chọn
// ...
if (a > 10 || Math.abs(a - 10) < EPSILON) {
    System.out.println("Nhan gia tri a");
} else {
    System.out.println("Khong nhan gia tri a");
}
4 Likes

Cảm ơn các bác, em sửa được rồi ạ

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