在gradle中解析双重会产生意想不到的值

时间:2018-06-13 07:59:02

标签: gradle build.gradle precision

我在gradle中编写了一个任务,当创建一个jar文件时,该任务会增加我的项目版本号。

我使用的是带有3位小数的简单十进制版本号,例如:version '2.001'

代码的工作原理是将字符串值解析为double,递增0.001并替换字符串。当从非零结束值递增时,代码工作正常。例如,2.001已正确增加到2.002。但是当我尝试解析零结束值时,例如2.010,我得到一个奇怪的错误。当值2.010Double.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)
}

版本为printlnversion '2.010'的结果如下:

2.0109999999999997
2.0119999999999996
version '2.0109999999999997'
version '2.0119999999999996'

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

要获得解释,请查看this answerthis 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