decimalformat - 无法提供小于小数位数定义的十进制字段
问题描述
我正在与 yang 合作(RFC 6020)。我在阳中有一个叶节点“频率”。频率字段的类型为 decimal64,小数位定义为 6,范围从 -90.000000 到 90.000000。在尝试验证和保存时,会发生以下情况:
- 保存 6 位小数的数字,例如。34.000001
- 没有小数的数字被保存,例如。34
但是当我尝试保存十进制值小于 6 位的数字时,它不会被保存。它给出以下错误:例如。
- 34.1:“decimal64 类型的小数位数 1 错误”
- 34.001:“十进制64类型的小数位数3错误”
- 34.00001:“十进制64类型的小数位数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 等
解决方案
小数位数设置为 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 ) 没有改变语言的这一方面(同样适用)。
推荐阅读
- python - 如何从 python 文件将本地 HTML 文件打开到浏览器中?
- python - 如何制作这个 MongoDB 查询?
- javascript - 使用 React Router Link 使整个表格行可点击
- c++ - 抛出 'std::out_of_range' 的实例后调用 C++ 终止 what(): basic_string::replace: __pos
- python - 如何使用 selenium python 将属性更改为随机数
- java - Java Stream:如何从 json 中找到 id?
- c++ - 如何在 C++ 中连接 char*?
- java - 如何在 Flutter 中将意图传递给方法通道
- node.js - 使用 axios 和 nodejs 处理 Redux Actions 中的错误对象
- python - 数据框列的 cumcount 反向