-1

我有一个方法

  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

4

3 回答 3

7

不要使用doubles 来表示软件版本号。它们应该存储为字符串。

正如您所注意到的,除了遇到精度问题外,版本号也不是十进制数。例如,约定是版本号1.11.10不相等(相反,1.10是版本后面1.9),版本号通常包含多个句点(例如,1.1.1)或非数字字符(例如,1.0b2)。

于 2013-02-11T01:48:05.903 回答
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 !

于 2013-02-11T01:45:33.737 回答
0

1-要安全地比较双精度,您需要执行以下操作:

boolean isEqual(double a, double b){
     return a == b ? true : Math.abs(a - b) < 0.000001; // some epsilon 
}

2-正如建议的那样,程序版本号应该是字符串而不是双倍

3-您可以实现类似于android 应用程序的东西,其中有两种类型的版本。首先,是内部integer version编号,每次构建都会增加,它可以用来比较程序版本;但是,这对用户是不可见的。其次,是字符串版本,它是一个字符串(即major.minor)并且对用户可见

于 2013-02-11T02:08:26.990 回答