我正在打包一个数字数组,通过UDP使用套接字编程发送到另一个硬件.
当我pack
的数字12.2然后unpack
它,我得到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";
Run Code Online (Sandbox Code Playgroud)
输出是:
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
Run Code Online (Sandbox Code Playgroud)
有什么方法可以控制精度吗?
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"
Run Code Online (Sandbox Code Playgroud)