Невозможно предоставить десятичные числа меньше, чем это определено в дробных цифрах

Я работаю с яном (RFC 6020). У меня есть листовой узел «Частота» в ян. Поле частоты имеет тип decimal64, а дробные числа определяются как 6 и находятся в диапазоне от -90,000000 до 90,000000. При попытке проверить и сохранить происходит следующее:

  1. Число с 6 десятичными знаками сохраняется, например. 34.000001
  2. Число без десятичных знаков сохраняется, например. 34

Но когда я пытаюсь сохранить число с десятичным значением менее 6 цифр, оно не сохраняется. Это дает следующую ошибку: например.

  • 34.1: "неверная дробь-цифры 1 для типа decimal64"
  • 34.001 : "неверная дробь-цифры 3 для типа decimal64"
  • 34.00001 : "неверная дробь-цифры 5 для типа decimal64"

Пробовал искать в нете. Документов по этому поводу не так много. Пробовал играть с параметром диапазона, но это не работает.

leaf Frequency {
    description "Frequency";
    type decimal64 {
        fraction-digits 6;
        range "-90.000000..90.000000";
    }
    default 0;
}

Я ожидаю, что смогу сохранять значения с/без десятичных значений, где ни одно из десятичных значений не может варьироваться от 0 до 6 цифр. например. 34, 34.1, 34.0004, 34.000001 и т.д.


person Rahil Khan    schedule 11.07.2019    source источник


Ответы (1)


Пространство значений для значения типа decimal64 YANG с дробными цифрами, установленными на 6, представляет собой действительные числа в следующем диапазоне: -9223372036854.775808..9223372036854.775807. 34, 34.1, 34.001, 34.004, 34.00001 все находятся в этом диапазоне и, следовательно, являются допустимыми значениями.

Вот что говорится в RFC о встроенном типе decimal64 (RFC6020, раздел 9.3, p1< /а>):

Тип decimal64 представляет подмножество действительных чисел, которые могут быть представлены десятичными числами. Пространство значений decimal64 — это набор чисел, которые можно получить, умножив 64-битное целое число со знаком на отрицательную степень числа десять, т. е. выражаемое как «i x 10^-n», где i — целое число64, а n — целое число. от 1 до 18 включительно.

Таким образом, в основном, d x 10^f, где d — десятичное значение 64, а f — дробные цифры, должно давать допустимое значение int64, которое диапазон от -9223372036854775808 до 9223372036854775807 включительно.

Вот как определяется цифра дроби (RFC6020, раздел 9.3.4, p1< /а>):

Оператор «fraction-digits», который является подоператором оператора «type», ДОЛЖЕН присутствовать, если тип «decimal64». В качестве аргумента принимает целое число от 1 до 18 включительно. Он контролирует размер минимальной разницы между значениями типа decimal64, ограничивая пространство значений числами, которые могут быть выражены как «i x 10^-n», где n — аргумент дробных цифр.

В следующей таблице перечислены минимальное и максимальное значение для каждого дробного числа:

+----------------+-----------------------+----------------------+
| fraction-digit | min                   | max                  |
+----------------+-----------------------+----------------------+
| 1              | -922337203685477580.8 | 922337203685477580.7 |
| 2              | -92233720368547758.08 | 92233720368547758.07 |
| 3              | -9223372036854775.808 | 9223372036854775.807 |
| 4              | -922337203685477.5808 | 922337203685477.5807 |
| 5              | -92233720368547.75808 | 92233720368547.75807 |
| 6              | -9223372036854.775808 | 9223372036854.775807 |
| 7              | -922337203685.4775808 | 922337203685.4775807 |
| 8              | -92233720368.54775808 | 92233720368.54775807 |
| 9              | -9223372036.854775808 | 9223372036.854775807 |
| 10             | -922337203.6854775808 | 922337203.6854775807 |
| 11             | -92233720.36854775808 | 92233720.36854775807 |
| 12             | -9223372.036854775808 | 9223372.036854775807 |
| 13             | -922337.2036854775808 | 922337.2036854775807 |
| 14             | -92233.72036854775808 | 92233.72036854775807 |
| 15             | -9223.372036854775808 | 9223.372036854775807 |
| 16             | -922.3372036854775808 | 922.3372036854775807 |
| 17             | -92.23372036854775808 | 92.23372036854775807 |
| 18             | -9.223372036854775808 | 9.223372036854775807 |
+----------------+-----------------------+----------------------+

Инструмент, который вы используете, неправильный. Следующее допустимо YANG:

  typedef foobar {
    type decimal64 {
      fraction-digits 6;
      range "-90.000000..90.000000";
    }
    default 34.00001;
  }

YANG 1.1 (RFC7950) не изменил этот аспект языка (тот же применяется).

person predi    schedule 11.07.2019