[英]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.