[英]Java overload on different parameter type (numeric) but same algorithm
我目前有幾種方法來比較兩個數字。 它們是完全相同的算法,只是參數類型不同。 但是,重載似乎復制粘貼太多。
當前代碼:
private boolean isFieldUpdateAllowed(float existingData, float submittedData) {
if (existingData > 0 && submittedData <= 0) {
return false;
}
if (existingData <= 0 && submittedData > 0) {
return true;
}
if (existingData > 0 && submittedData > 0 && existingData != submittedData) {
return true;
}
return false;
}
private boolean isFieldUpdateAllowed(int existingData, int submittedData) {
if (existingData > 0 && submittedData <= 0) {
return false;
}
if (existingData <= 0 && submittedData > 0) {
return true;
}
if (existingData > 0 && submittedData > 0 && existingData != submittedData) {
return true;
}
return false;
}
// other numeric type comparison
有什么辦法可以簡化代碼?
啊,是的,我很傻...謝謝。 使用
double
是好的。
不,等等。 沒那么快。
對於整數類型,是的,您可以用具有long
參數類型的方法替換所有重載。 其他整數類型都可以轉換為long
而不會丟失任何信息,並且比較將按預期進行。
但是當我們double
時有一個問題。
問題是double
精度只有 53 個二進制位。 因此,當您將足夠大的long
值轉換為double
時,您會得到一個在數學上不等於原始值的數字。
所以當比較這個時:
if (existingData > 0 && submittedData > 0 && existingData != submittedData) {
return true;
}
在long
和double
情況下,對於某些參數值,帶有long
值的!=
測試將為true
,但對於轉換后的double
值,它將為false
...因為轉換中的精度損失。
簡而言之,您必須對long
和double
都進行重載,否則在某些情況下您可能會得到不正確的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.