我有像
这样的方法 private static double getMinorVersion(final double minorVersion) {
return minorVersion + 0.1;
}
当我测试这个
时 final Version version = new Version(1.3, VersionType.MINOR, 0.0);
final Version newVersion = versionManager.patch(version);
assertEquals(1.4, newVersion.getVersionNumber(), delta); // delta = 0.0
我得到了
java.lang.AssertionError:
Expected :1.4
Actual :1.4000000000000001
如何修复它以返回1.4
?
答案 0 :(得分:7)
请勿使用double
来表示软件版本号。它们应该存储为字符串。
除了遇到精确问题之外,您已经注意到,版本号不是十进制数。例如,惯例是版本号1.1
和1.10
不相等(相反,1.10
是1.9
之后的版本),版本号通常包含多个句点(例如,1.1.1
)或非数字字符(例如,1.0b2
)。
答案 1 :(得分:1)
您可以通过显式选择精度然后舍入来修复它。一种方法是暂时转换为int
,如下所示:
private static double getMinorVersion(final double minorVersion) {
return ((int) ((minorVersion + 0.1) * 100)) / 100.0;
}
当然,使用100
会给你两位数的精度,比如1.38,但你不能做1.293。
旁白:应该是显而易见的,但请记住,getMinorVersion(1.9)
会给你2.0,而不是1.10!
答案 2 :(得分:0)
1- 要安全地比较双倍,您需要执行以下操作:
boolean isEqual(double a, double b){
return a == b ? true : Math.abs(a - b) < 0.000001; // some epsilon
}
2-如建议的那样,程序版本号应该是字符串而不是 double
3-你可以实现类似于 android app 的东西,其中有两种类型的版本。首先,内部integer version
数字总是随着每个构建而增加,它可以用来比较程序版本;但是这对用户不可见。第二,是字符串版本,它是一个字符串(即major.minor)并且对用户可见