-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

doubleソフトウェアのバージョン番号を表すのに s を使用しないでください。それらは文字列として保存する必要があります。

お気づきのように、精度の問題が発生することに加えて、バージョン番号は 10 進数ではありません。たとえば、バージョン番号1.11.10は等しくなく (代わりに1.10の後にバージョンが続く1.9)、バージョン番号には通常、複数のピリオド ( など1.1.1) または数字以外の文字 ( など1.0b2) が含まれます。

于 2013-02-11T01:48:05.903 に答える
1

精度を明示的に選択してから丸めることで修正できます。これを行う 1 つの方法は、次のintように一時的にキャストすることです。

private static double getMinorVersion(final double minorVersion) {
    return ((int) ((minorVersion  + 0.1) * 100)) / 100.0;
}

もちろん、を使用100すると、1.38 のように 2 桁の精度が得られますが、たとえば 1.293 を実行することはできません。

余談: 明らかなはずですがgetMinorVersion(1.9)、 1.10 ではなく 2.0 が返されることに注意してください。

于 2013-02-11T01:45:33.737 に答える
0

1- double を安全に比較するには、次のようにする必要があります。

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

2-提案されているように、プログラムのバージョン番号は2倍ではなく文字列にする必要があります

3- 2 種類のバージョンがあるAndroid アプリに似たものを実装できます。integer versionまず、ビルドごとに常に増加する内部番号であり、プログラムのバージョンを比較するために使用できます。ただし、これはユーザーには表示されません。2 番目は、文字列 (メジャー.マイナー) であり、ユーザーに表示される文字列バージョンです。

于 2013-02-11T02:08:26.990 に答える