我在gradle中编写了一个任务,当创建一个jar文件时,该任务会增加我的项目版本号。
我使用的是带有3位小数的简单十进制版本号,例如:version '2.001'
。
代码的工作原理是将字符串值解析为double,递增0.001并替换字符串。当从非零结束值递增时,代码工作正常。例如,2.001
已正确增加到2.002
。但是当我尝试解析零结束值时,例如2.010
,我得到一个奇怪的错误。当值2.010
被Double.parseDouble
解析为双精度值时,该值将被读取为2.010999999999999997
。
完整代码如下:
task increaseVersionCode {
double versionCode = Double.parseDouble(version.toString())
println versionCode
versionCode += 0.001
println versionCode
println "version '$version'"
println "version '" + versionCode + "'"
String newBuildFile = buildFile.getText().replaceFirst("version '$version'","version '" + versionCode + "'")
buildFile.setText(newBuildFile)
}
版本为println
时version '2.010'
的结果如下:
2.0109999999999997
2.0119999999999996
version '2.0109999999999997'
version '2.0119999999999996'
为什么会发生这种情况?
答案 0 :(得分:1)
要获得解释,请查看this answer和this one,这些都是关于内部表示的。
对于解决方案,请使用BigDecimal
double a = 2.010 + 0.001;
System.out.println(a);
BigDecimal b = BigDecimal.valueOf(2.010);
System.out.println(b.add(BigDecimal.valueOf(0.001)));
输出:
2.0109999999999997
2.011