[英]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.1
和1.10
不相等(相反, 1.10
是1.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.