2013-04-12 39 views
39

Tôi có giá trị gấp đôi mà tôi phải hiển thị tại giao diện người dùng của mình. Bây giờ điều kiện là giá trị thập phân của double = 0 ví dụ. - 14.0 Trong trường hợp đó, tôi chỉ hiển thị 14 trên giao diện người dùng của mình. Ngoài ra, giới hạn tối đa cho các ký tự là 5 ở đây.Cách kiểm tra xem giá trị kép có không có phần thập phân hay không

ví dụ.- 12.34 giá trị số nguyên không thể lớn hơn 2 chữ số và do đó là giá trị thập phân cho số double của chúng tôi.

Cách tốt nhất để làm điều này là gì?

Trả lời

129

Bạn chỉ cần thực hiện việc này: d % 1 == 0 để xem có một số double d là toàn bộ hay không.

+4

Double.MIN_VALUE% 1 == 0 này cho false –

+6

@Evgeniy Sau khi tất cả, 'Double.MIN_VALUE' không phải là toàn bộ. –

+1

+1 bạn là người nghiêm khắc –

2

So sánh hai giá trị: double bình thường và double sau floor. Nếu chúng có cùng giá trị, không có thành phần thập phân.

12
double d = 14.4; 
if((d-(int)d)!=0) 
    System.out.println("decimal value is there"); 
else 
    System.out.println("decimal value is not there"); 
+1

Bạn nên có thể sử dụng '! =' thay vì '>', vì nó sẽ trả về false cho các giá trị âm 'd'. –

+0

nó không hoạt động với -11111111111111.1; –

+0

ohh có, tôi đã cập nhật mã của mình. Cảm ơn :) –

6

hoặc ceil và sàn nhà nên cung cấp cho cùng ra ngoài đưa

Math.ceil(x.y) == Math.floor(x.y) 

hoặc đơn giản là kiểm tra bình đẳng với giá trị gấp đôi

x.y == Math.ceil(x.y) 
x.y == Math.floor(x.y) 

hoặc

Math.round(x.y) == x.y 
+1

Điều gì về '' 'Math.round (x) == x''' trong đó' '' x''' là biểu thức được nhập đôi. –

1

Tách lấy số trình định dạng để định dạng giá trị, theo yêu cầu d. Vui lòng kiểm tra this.

7

Tất cả các số nguyên là modulo 1. Vì vậy, kiểm tra bên dưới phải cung cấp cho bạn câu trả lời.

if(d % 1 == 0) 
1

Bạn có thể muốn làm tròn gấp đôi đến 5 số thập phân hoặc trước khi so sánh vì đôi có thể chứa các phần thập phân rất nhỏ nếu bạn đã thực hiện một số phép tính với nó.

double d = 10.0; 
d /= 3.0; // d should be something like 3.3333333333333333333333... 
d *= 3.0; // d is probably something like 9.9999999999999999999999... 

// d should be 10.0 again but it is not, so you have to use rounding before comparing 

d = myRound(d, 5); // d is something like 10.00000 
if (fmod(d, 1.0) == 0) 
    // No decimals 
else 
    // Decimals 

Nếu bạn đang sử dụng C++ tôi không nghĩ rằng có một tròn chức năng, vì vậy bạn phải thực hiện nó cho mình như trong: http://www.cplusplus.com/forum/general/4011/

0

Thú vị chút vấn đề. Đó là một chút khó khăn, kể từ số thực, không phải lúc nào cũng đại diện cho các số nguyên chính xác, ngay cả khi chúng có nghĩa là, vì vậy điều quan trọng là để cho phép một sự khoan dung.

Ví dụ khoan dung có thể là 1E-6, trong các bài kiểm tra đơn vị, tôi giữ một dung sai khá thô để có số ngắn hơn.

Không ai trong số các câu trả lời mà tôi có thể đọc hiện đang làm việc theo cách này, vì vậy đây là giải pháp của tôi:

public boolean isInteger(double n, double tolerance) { 
    double absN = Math.abs(n); 
    return Math.abs(absN - Math.round(absN)) <= tolerance; 
} 

Và kiểm tra đơn vị, để đảm bảo nó hoạt động:

@Test 
public void checkIsInteger() { 
    final double TOLERANCE = 1E-2; 
    assertThat(solver.isInteger(1, TOLERANCE), is(true)); 

    assertThat(solver.isInteger(0.999, TOLERANCE), is(true)); 
    assertThat(solver.isInteger(0.9, TOLERANCE), is(false)); 

    assertThat(solver.isInteger(1.001, TOLERANCE), is(true)); 
    assertThat(solver.isInteger(1.1, TOLERANCE), is(false)); 

    assertThat(solver.isInteger(-1, TOLERANCE), is(true)); 

    assertThat(solver.isInteger(-0.999, TOLERANCE), is(true)); 
    assertThat(solver.isInteger(-0.9, TOLERANCE), is(false)); 

    assertThat(solver.isInteger(-1.001, TOLERANCE), is(true));   
    assertThat(solver.isInteger(-1.1, TOLERANCE), is(false)); 
} 
Các vấn đề liên quan