Java метод trunc () эквивалент - PullRequest
1 голос
/ 03 октября 2019

Класс java.lang.Math имеет методы ceil (), floor (), round (), но не имеет trunc () one.

В то же время япосмотрите на практике, что метод .intValue () (который фактически (int) приведёт) выполняет именно то, что я ожидаю от trunc () в его стандартном значении.

Однако я не могу найти какую-либо конкретную документацию, которая подтверждает, чтоintValue () является полным эквивалентом trunc (), и это странно с многих точек зрения, например:

  • Описание «Возвращает значение этого Double как int (byприведение к типу int) "из https://docs.oracle.com/javase/7/docs/api/java/lang/Double.html ничего не говорит о том, что оно" возвращает целую часть дробного числа "или тому подобное.

  • Статья Что такое .intValue () в Java? ничего не говорит о том, что он ведет себя как trunc ().

  • Все мои поиски "метода Java-усечения" или тому подобное не делали 'ничего не дает, как будто я единственный, кто ищет trunc () и как будто я не знаю некоторыхвещь, которую все знают.

Можно ли как-нибудь получить подтверждение того, что я могу безопасно использовать intValue () для округления дробных чисел в режиме «усечения»?

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Таким образом, возникает вопрос: Приводит ли тип double к целому числу, равному усечению ?

Спецификация языка Java может иметь ответ. Я процитирую:

конкретные преобразования на примитивных типах называются сужающими преобразованиями примитивов:

[...]

  • float to byte, short, char, int или long
  • double to byte, short, char, int, long или float

Сужающее примитивное преобразование может потерять информациюоб общей величине числового значения и может также потерять точность и диапазон.

[...]

Сужающее преобразование числа с плавающей запятой вцелочисленный тип T имеет два шага:

  • На первом шаге число с плавающей запятой преобразуется либо в [...] значение типа int, если T является байтом, коротким, символьным или int,следующим образом:
    • Если число с плавающей запятой равно NaN (§4.2.3), результатом первого шага преобразования будет int или long 0.
    • В противном случае, еслиЧисло с плавающей точкой не является бесконечностью, значение с плавающей точкой округляется до целого значения V, с округлением в сторонуноль с использованием режима округления до нуля IEEE 754 (§4.2.3). Тогда есть два случая:
      • Если T длинный, и это целочисленное значение может быть представлено как long, то результатом первого шага будет длинное значение V.
      • В противном случае, еслиэто целочисленное значение может быть представлено как int, тогда результатом первого шага будет значение int V.

, которое описанов IEEE 754-1985 .

0 голосов
/ 30 октября 2019

Вы можете использовать floor и ceil для реализации trunc

  public static double trunc(double value) { 
      return value<0 ? Math.ceil(value) : Math.floor(value);
  }

С помощью Google Guava DoubleMath # roundToInt () вы можете преобразовать этот результат в int:

  public static int roundToInt(double x, RoundingMode mode) {
    double z = roundIntermediate(x, mode);
    checkInRangeForRoundingInputs(
       z > MIN_INT_AS_DOUBLE - 1.0 & z < MAX_INT_AS_DOUBLE + 1.0, x, mode);
    return (int) z;
  }

  private static final double MIN_INT_AS_DOUBLE = -0x1p31;
  private static final double MAX_INT_AS_DOUBLE = 0x1p31 - 1.0;
...