首页 > 解决方案 > 无法提供小于小数位数定义的十进制字段

问题描述

我正在与 yang 合作(RFC 6020)。我在阳中有一个叶节点“频率”。频率字段的类型为 decimal64,小数位定义为 6,范围从 -90.000000 到 90.000000。在尝试验证和保存时,会发生以下情况:

  1. 保存 6 位小数的数字,例如。34.000001
  2. 没有小数的数字被保存,例如。34

但是当我尝试保存十进制值小于 6 位的数字时,它不会被保存。它给出以下错误:例如。

试图在网上搜索。这方面的文档不多。尝试使用范围参数,但它不起作用。

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 等

标签: decimalformatietf-netmod-yang

解决方案


小数位数设置为 6 的 decimal64 YANG 类型值的值空间是以下范围内的实数:-9223372036854.775808..9223372036854.775807. 34, 34.1, 34.001, 34.004,34.00001都在这个范围内,因此是有效值。

这就是 RFC 关于 decimal64 内置类型的说法(RFC6020,第 9.3 节,p1):

decimal64 类型表示实数的子集,可以用十进制数字表示。decimal64的值空间是64位有符号整数乘以10的负幂得到的一组数字,即表示为“ix 10^-n”,其中i是整数64,n是整数介于 1 和 18 之间(含)。

所以基本上,d x 10^f其中d是一个十进制64值并且f是小数位,必须产生一个有效的int64值,范围从-9223372036854775808到9223372036854775807,包括在内。

以下是小数位数的定义方式(RFC6020,第 9.3.4 节,p1):

如果类型是“decimal64”,则必须存在“fraction-digits”语句,它是“type”语句的子语句。它将 1 到 18 之间的整数作为参数,包括 1 和 18。它通过将值空间限制为可表示为“ix 10^-n”的数字来控制 decimal64 类型值之间的最小差异的大小,其中 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 ) 没有改变语言的这一方面(同样适用)。


推荐阅读