繁体   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