浮点运算精度丢失

最近零才在使用JavaScript对经纬度坐标进行度分秒转换时,才知道计算机是用二进制来存储和处理数字,不能精确表示浮点数,而JavaScript中没有相应的封装类来处理浮点数运算,会直接计算导致运算精度丢失。

浮点计算精度丢失的问题不单单出现在javascript中,所有编程语言都会如此,不出现这个问题一般是编程语言已进行过封包。而解决精度差异的通用方法是:把需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂)。于是问题来了,经纬度坐标转换过程中,以度为单位或者转换到秒,10的n次幂的n取多少合适呢?也即是以度或秒为单位,小数位数取多少合适呢?

经纬度每度的长度是多少?

纬度的每个度大约相当于111km,经度的每个度的距离从0km到111km不等,它的距离随纬度的不同而变化,等于111km乘纬度的余弦。于是可以这样认为:

纬度1度 = 大约111km
纬度1分 = 大约1.85km
纬度1秒 = 大约30.8m
纬度0.0001秒=0.00308m=3.08mm
1mm = 1度 * 10-8

从上面可以看出,纬度精确到0.0001秒才能达到毫米级,精确到10^-8度才能达到毫米级,这样,若想精确到米,则取到10^-5度或0.1秒,若需要精确到厘米,则取到10^-7度或0.001秒。

因此,零才在写度分秒转换函数的时候,根据这个原则进行了小数位数的精确。

您可能还喜欢:

评论已关闭。