繁体   English   中英

java如何将双倍1.4000000000000001转换为1.4?

[英]java how do I convert double 1.4000000000000001 to 1.4?

我有一个类似的方法

  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

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

就像您已经注意到的那样,随着精度问题的出现,版本号也不是十进制数。 例如,约定是版本号1.11.10不相等(相反, 1.101.9的版本),并且版本号通常包含多个句点(例如1.1.1 )或非数字字符(例如1.0b2 )。

您可以通过显式选择精度然后四舍五入来修复它。 一种方法是暂时将其强制转换为如下所示的int

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

当然,使用100将为您提供两位数的精度,例如1.38,但是您将无法执行1.293。

getMinorVersion(1.9) :应该很明显,但是请记住, getMinorVersion(1.9)将为您提供2.0,而不是1.10!

1-为了安全地比较两倍,您需要执行以下操作:

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

2-如建议,程序版本号应为字符串, 而不是双精度

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM