Android 通过Channel 传递 Float 到 Dart ,精度丢失。

40 阅读1分钟

问题:Android 通过 channel 传递 1.2f 到 Dart。

期望:Dart 接收到的是 1.2f

实际:Dart 接收到的 是 1.2021211f (也可能为其他float)。

原因:float 本身就是不准的。 Android上的1.2f 是假象(虚拟机帮你构建了这个假象)。实际上也是一个很长的浮点数。

解决办法:通信的时候尽可能传递 String 类型。可以直接传递 jsonString。避免类似的问题。

细节:

近日,在写一个 Flutter Channel 的时候发现。 从 Android 传递 0.5f,1.0f,1.2f, 1.8f, 2.0f 到 Dart 时候。

0.5f, 1.0f, 2.0f 都可以正常传递。

1.2f, 1.8f 会失真。Dart 解析得到的是一个接近 1.2f, 1.8f的小数字。

看了 Flutter 代码,以为是 Hive 数据库导致的。 但是再通过断点,发现实际 Android 端传递过来的数字就是不精确的浮点数。

查询资料

image.png

浮点数是一个近似值。尽管写浮点数为 1.2f。这个数也是一个近似值。

那么怎么处理 Android 传递浮点数到 Flutter 的精度问题呢?

答案:传递一个 "1.2" 到Flutter即可。建议双端通信都使用String。