Có thể kiểm tra xem a float
là số 0 dương (0.0) hay số 0 âm (-0.0) không?
Tôi đã chuyển đổi float
thành a String
và kiểm tra xem đầu tiên char
có phải là a hay không '-'
, nhưng có bất kỳ cách nào khác không?
Có thể kiểm tra xem a float
là số 0 dương (0.0) hay số 0 âm (-0.0) không?
Tôi đã chuyển đổi float
thành a String
và kiểm tra xem đầu tiên char
có phải là a hay không '-'
, nhưng có bất kỳ cách nào khác không?
Câu trả lời:
Có, chia cho nó. 1 / +0.0f
là +Infinity
, nhưng 1 / -0.0f
là -Infinity
. Thật dễ dàng để tìm ra nó là cái nào bằng một phép so sánh đơn giản, vì vậy bạn sẽ nhận được:
if (1 / x > 0)
// +0 here
else
// -0 here
(điều này giả định rằng đó x
chỉ có thể là một trong hai số 0)
if (math.copySign (1.0, x) < 0.0) ...
math.copySign(1.0,x)<0.0
là "dễ" hơn như thế nào 1/x>0
. Ý tôi là cả hai đều khá khó giải thích, vì vậy dù sao bạn cũng muốn có một chức năng cho việc đó
Bạn có thể sử dụng Float.floatToIntBits
để chuyển đổi nó thành một int
và nhìn vào mẫu bit:
float f = -0.0f;
if (Float.floatToIntBits(f) == 0x80000000) {
System.out.println("Negative zero");
}
(Float.floatToIntBits(f) & 0x80000000) < 0
Rõ ràng không phải là cách tiếp cận tốt nhất. Kiểm tra chức năng
Float.floatToRawIntBits(f);
Doku:
/**
* Returns a representation of the specified floating-point value
* according to the IEEE 754 floating-point "single format" bit
* layout, preserving Not-a-Number (NaN) values.
*
* <p>Bit 31 (the bit that is selected by the mask
* {@code 0x80000000}) represents the sign of the floating-point
* number.
...
public static native int floatToRawIntBits(float value);
Double.equals
phân biệt ± 0.0 trong Java. (Còn nữa Float.equals
.)
Tôi hơi ngạc nhiên là không ai đề cập đến những điều này, vì đối với tôi chúng dường như rõ ràng hơn bất kỳ phương pháp nào được đưa ra cho đến nay!
Khi số float là số âm (bao gồm -0.0
và -inf
), nó sử dụng cùng một bit dấu với số nguyên âm. Điều này có nghĩa là bạn có thể so sánh biểu diễn số nguyên với 0
, loại bỏ sự cần thiết phải biết hoặc tính toán biểu diễn số nguyên của -0.0
:
if(f == 0.0) {
if(Float.floatToIntBits(f) < 0) {
//negative zero
} else {
//positive zero
}
}
Điều đó có thêm một nhánh đối với câu trả lời được chấp nhận, nhưng tôi nghĩ nó dễ đọc hơn nếu không có hằng số hex.
Nếu mục tiêu của bạn chỉ là coi -0 là số âm, bạn có thể bỏ if
câu lệnh bên ngoài :
if(Float.floatToIntBits(f) < 0) {
//any negative float, including -0.0 and -inf
} else {
//any non-negative float, including +0.0, +inf, and NaN
}