簡體   English   中英

Java 不同參數類型(數字)但算法相同的過載

[英]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;
    }

longdouble情況下,對於某些參數值,帶有long值的!=測試將為true ,但對於轉換后的double值,它將為false ...因為轉換中的精度損失。

簡而言之,您必須對longdouble都進行重載,否則在某些情況下您可能會得到不正確的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM