【问题标题】:Not able to provide deicmal fields less than that is defined in fraction-digits无法提供小于小数位数定义的十进制字段
【发布时间】:2019-11-20 23:43:00
【问题描述】:

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

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

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

  • 34.1: “decimal64 类型的小数位数 1 错误”
  • 34.001: “decimal64 类型的小数位数 3 错误”
  • 34.00001: “decimal64 类型的小数位数 5 错误”

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

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 等

【问题讨论】:

    标签: decimalformat ietf-netmod-yang


    【解决方案1】:

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

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

    decimal64 类型表示实数的子集,可以 用十进制数字表示。 decimal64 的值空间为 可以通过乘以 64 位获得的一组数字 十的负幂的有符号整数,即,可表示为 "i x 10^-n" 其中 i 是一个整数 64,n 是介于 1 和 18,包括在内。

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

    这是小数位数的定义方式 (RFC6020, Section 9.3.4, p1):

    “分数位”语句,它是 “type”语句,如果类型是“decimal64”,则必须存在。它 将 1 到 18 之间的整数作为参数,包括 1 和 18。它 控制a的值之间的最小差异的大小 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) 没有改变语言的这一方面(同样适用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-07
      • 2010-09-22
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2020-07-11
      相关资源
      最近更新 更多