Разбор double в gradle дает неожиданные значения - PullRequest
0 голосов
/ 13 июня 2018

Я написал задачу в gradle, которая увеличивает номер версии моего проекта при создании jar-файла.

Я использую простой десятичный номер версии с 3 десятичными знаками, например: version '2.001'.

Код работает путем разбора строкового значения до двойного, увеличения на 0,001 и замены строки.При увеличении с ненулевого конечного значения код работает нормально.например, 2.001 правильно увеличено до 2.002.Но когда я пытаюсь проанализировать нулевое окончание, например 2.010, я получаю странную ошибку.Когда значение 2.010 анализируется как double на 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'

Есть идеи, почемуэто происходит?

1 Ответ

0 голосов
/ 13 июня 2018

Для объяснения взгляните на этот ответ и этот тоже, это все о внутреннем представлении.

Для решения используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...