Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Dart获取双精度的4个字节_Dart_Double_Byte_Modbus - Fatal编程技术网

使用Dart获取双精度的4个字节

使用Dart获取双精度的4个字节,dart,double,byte,modbus,Dart,Double,Byte,Modbus,我有以下问题,我找不到解决方案。 我有一个值为2.1的双变量,我想得到表示它的4个字节。 为此,我使用以下代码 var valueFloat = new Float32List (1); valueFloat [0] = double.parse ("2.1"); var listOfBytes = valueFloat.buffer.asUint8List (); 我得到了字节列表,但我看到从double到Float32的转换值是2.099999 问题是,我必须通过MOD

我有以下问题,我找不到解决方案。 我有一个值为2.1的双变量,我想得到表示它的4个字节。 为此,我使用以下代码

var valueFloat = new Float32List (1);
valueFloat [0] = double.parse ("2.1");
var listOfBytes = valueFloat.buffer.asUint8List ();
我得到了字节列表,但我看到从double到Float32的转换值是2.099999

问题是,我必须通过MODBUS TCP发送字节,最终在设备上配置的值是2099,而不是2.1

我尝试了通过谷歌搜索找到的所有表单,但它们都通过了双精度浮点运算。 有没有办法直接从double中获取字节


提前谢谢你能给我的帮助

你所做的是正确的

问题是,
2.1
不作为32位浮点值存在(也不作为64位浮点值存在,即double)

2.1
双精度值实际上具有值2.1000000000000088817841970012523233890533447265625。 这是最接近数学值2.1的双精度值,所以这就是将2.1写成双精度时得到的结果

将该值存储到(32位)浮点中时,将拾取最近的浮点值。 两个最接近的可表示浮动值为:

  • 2.09999094632568359375
  • 2.10000143051474609375
前者与双精度“2.1”(约0.000000095 vs约0.000000143)的距离较小,因此这是用于表示双精度值的浮点数

即使你可以直接写浮点数,较小的数字也更接近数学数字2.1,所以它仍然是你得到的数字

可能发生的情况是,在另一端,MODBUS服务器读取您的浮点值,将其转换回一个双精度浮点值,这样就不会丢失。这个双精度不是“2.1”的双精度,因此它被视为小于2.1。当他们接着做
.toFixed(3)
(或者不管他们做什么来得到三个小数),这就是你最终得到的结果

如果您选择了较大的浮动,那么它也将不同于2.1,但至少它有一个优势,即它使用三个小数位数舍入到2.100

如果您知道这一点,也许可以选择一个按需舍入的浮点值,而不是一个更接近实际双精度的浮点值:

///返回近似于双精度的浮点值(作为双精度)。
double roundableFloat(双双值,整数分数位数){
var目标=doubleValue.toStringAsFixed(分数位数);
var buffer=Float32List(1);
缓冲区[0]=双值;
var取整=缓冲区[0];
var结果=四舍五入。toStringAsFixed(分数位数);
如果(结果!=目标){
//假设浮点数和整数具有相同的endianness。
//在手臂上并不总是正确的,所以可能需要更多的聪明。
buffer.buffer.asUint32List()[0]+=四舍五入

虽然有些麻烦且效率低下,但如果您无法修复服务器,这可能会有所帮助。

感谢您的详细回答,完成在MODBUS服务器中实施更改的决定非常有帮助,以对数据进行取整并避免用户压缩问题。问候

另见: