perl – 当我打包和解包浮点数时,如何消除浮点不准确?

我正在打包一个数字数组,通过UDP使用套接字编程发送到另一个硬件.

当我打包12.2然后打开它时,我得到12.199999892651.当我处理与纬度和经度相关的数字时,我不能有这样的偏差.

这是我写的简单脚本:

use warnings;

use Time::HiRes qw (sleep);

@Data = ( 20.2, 30.23, 40.121, 1, 2, 3, 4, 6. 4, 3.2, 9.9, 0.1, 12.2, 0.99, 7.8, 999, 12.3 );

$myArr = pack('f*', @Data);

print "$myArr\n\n";

@Dec = unpack('f*',$myArr);

print "@Dec";

输出是:

20.2000007629395 30.2299995422363 40.1209983825684 1 2 3 4 6.40000009536743 3.20 000004768372 9.89999961853027 0.100000001490116 12.1999998092651 0.9900000095367 43 7.80000019073486 999 12.3000001907349

有什么方法可以控制精度吗?

最佳答案
pack的f模板用于单精度浮点数,在大多数平台上,精度为7位左右. d模板提供双精度,并且足够大约15个小数位.

print unpack("f", pack("f",12.2));          # "12.1999998092651"
print unpack("d", pack("d",12.2));          # "12.2"

printf "%.20f",unpack("f", pack("f",12.2)); # "12.19999980926513671875"
printf "%.20f",unpack("d", pack("d",12.2)); # "12.19999999999999928946"

转载注明原文:perl – 当我打包和解包浮点数时,如何消除浮点不准确? - 代码日志