我正在嘗試創建謂詞來測驗字串并確定最合適的變數型別,這意味著我想獲得決議后的字串適合的“最小”數字變數型別。
例如,對于字串“-1.2”,檢測到的型別應該是浮點數,但如果數字超出浮點數范圍,它應該檢測雙精度。如果數字更大,那么 BigDecimal。
對于非浮點數,我的測驗似乎運行良好,但十進制數讓我感到頭疼。
這是我的 isFloat 測驗:
Predicate<String> isFloat =
s -> {
try {
Double d = Double.parseDouble(s);
return d >= -Float.MAX_VALUE && d <= Float.MAX_VALUE;
} catch (Exception e) {
return false;
}
};
String minOfFloat = String.valueOf(-Float.MAX_VALUE);
System.out.println(minOfFloat);
System.out.println(Double.parseDouble(minOfFloat));
System.out.println(isFloat.test(minOfFloat));
輸出:
-3.4028235E38
-3.4028235E38
false //WHYYYYY
同樣,我的下一個測驗是檢查數字是否適合雙精度,如果不適合,則回傳“BigDecimal”。
測驗這個的正確方法是什么?
編輯:這就是我這樣做的方式,接受的答案把我帶到了那里:
public static final Predicate<String> isFloat =
s -> {
try {
Double d = Double.parseDouble(s);
return d.floatValue() >= -Float.MAX_VALUE
&& d.floatValue() <= Float.MAX_VALUE
&& !Float.isInfinite(d.floatValue())
&& !Float.isNaN(d.floatValue());
} catch (Exception e) {
return false;
}
};
uj5u.com熱心網友回復:
更改要與之比較的謂詞d.floatValue() >= -Float.MAX_VALUE && d <= Float.MAX_VALUE;
萬一,如果您的雙精度值超出浮點范圍,則d.floatValue()回傳無窮大,因此您應該對更改感到滿意
Predicate<String> isFloat = s -> {
try {
Double d = Double.parseDouble(s);
return d.floatValue() >= -Float.MAX_VALUE && d <= Float.MAX_VALUE;
} catch (Exception e) {
return false;
}
};
String maxDouble = String.valueOf(Double.MAX_VALUE);
System.out.println(maxDouble);
System.out.println(isFloat.test(maxDouble));
uj5u.com熱心網友回復:
當應用加寬基元轉換時,建議使用 BigDecimal。我找不到好的副本,但請參閱此帖子
如何正確比較 long-and-float-primitives
java中比較浮點和雙原語
了解為什么在比較兩種不同型別時可能會得到錯誤的結果。所以我會做類似的事情:
Predicate<String> isFloat =
str -> new BigDecimal(str).compareTo(new BigDecimal(String.valueOf(Float.MAX_VALUE))) <= 0 &&
new BigDecimal(str).compareTo(new BigDecimal(String.valueOf(-Float.MAX_VALUE))) >= 0;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/461359.html
