java如何将双1.4000000000000001转换为1.4?

时间:2013-02-11 01:42:17

标签: java floating-point double

我有像

这样的方法
  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

3 个答案:

答案 0 :(得分:7)

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

除了遇到精确问题之外,您已经注意到,版本号不是十进制数。例如,惯例是版本号1.11.10不相等(相反,1.101.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)并且对用户可见