gpt4 book ai didi

dart - 使用 Dart 获取 double 的 4 个字节

转载 作者:行者123 更新时间:2023-12-03 02:52:24 25 4
gpt4 key购买 nike

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

var valueFloat = new Float32List (1);
valueFloat [0] = double.parse ("2.1");
var listOfBytes = valueFloat.buffer.asUint8List ();

我得到了字节列表,但我看到在从 double 转换为 Float32 时,值是 2.099999 ...

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

我尝试了通过谷歌搜索找到的所有形式,但它们都通过 double 传递到 float。有没有办法直接从 double 中获取字节?

预先感谢您能给我的帮助!

最佳答案

你所做的是正确的。

问题是 2.1 不是 32 位浮点值(也不是 64 位浮点值,也就是 double 值)。

2.1 double 值实际值为 2.100000000000000088817841970012523233890533447265625。这是最接近数学值 2.1 的 double 值,因此这就是将 2.1 写为 double 时得到的结果。

当该值存储到(32 位) float 时,将选择最接近的浮点值。两个最接近的可表示浮点值是:

  • 2.099999904632568359375
  • 2.1000001430511474609375

前者与 double “2.1”的距离更小(~0.000000095 vs ~0.000000143),因此这是用于表示 double 值的 float 。

即使你可以直接写 float ,较小的数字也更接近数学上的数字 2.1,所以它仍然是你得到的那个。

可能发生的情况是,在另一端,MODBUS 服务器读出您的 float ,然后将其转换回 double ,而不会丢失。该 double 不是“2.1”的 double ,因此它被视为小于 2.1。当他们然后执行 .toFixed(3)(或他们为获得三位小数所做的任何事情)时,这就是您最终得到的结果。

如果您选择了较大的 float ,那么它也将与 2.1 不同,但至少它具有四舍五入为 2.100 的优点,带有三个小数位。

如果你知道这一点,也许你可以选择一个你想要的四舍五入的浮点值,而不是更接近实际 double 的值:

/// Returns a float value (as a double) that approximates the double.
double roundableFloat(double doubleValue, int fractionalDigits) {
var target = doubleValue.toStringAsFixed(fractionalDigits);
var buffer = Float32List(1);
buffer[0] = doubleValue;
var rounded = buffer[0];
var result = rounded.toStringAsFixed(fractionalDigits);
if (result != target) {
// Assume same endianness for floats and integers.
// Not always true on ARM, so more cleverness might be needed.
buffer.buffer.asUint32List()[0] += rounded < doubleValue ? 1 : -1;
rounded = buffer[0];
}
return rounded;
}

有些麻烦和低效,但如果您无法修复服务器,它可能会有所帮助。

关于dart - 使用 Dart 获取 double 的 4 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62677205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com