.toFixed()结果的问题

时间:2014-09-26 09:21:53

标签: javascript

美好的一天,

我还在学习JS和HTML,我注意到了一些非常有趣的东西

我正在使用Google地理编码脚本并在地图上创建了一个点击事件来检索GPS坐标,

 function onClickCallback(event){
    var str = event.latLng.toString().slice(1,-1).split(',', 2);
    var lat1 = parseFloat(str[0]).toFixed(5);
    var lng1 = parseFloat(str[1]).toFixed(5);
    var latlng1 = new google.maps.LatLng(lat1,lng1).toString().slice(1,-1);

    document.getElementById('latlng').value = latlng1;

这完全符合我的需要,但出于某种奇怪的原因,第二部分" lng1"不会按预期向下舍入,例如,下面是结果

-25.3341,27.64984000000004或-25.34403,27.97393999999997

作为第一部分' lat1'工作正常第二部分的原因或原因是什么?lng1'不舍入,只显示前5位小数,如何修复

1 个答案:

答案 0 :(得分:1)

问题很可能是类型转换和javascript内置浮点数表示的组合。

当您致电toFixed()时,您的号码实际上会转换为具有所需小数位数的字符串。 google.maps.LatLng()需要两个数字,但由于您没有收到任何错误,因此接收数字的字符串表示也很好。

在内部,我假设google.maps.LatLng()再次将lat1lng1参数转换为数字。由于javascript代表数字的方式通常会导致较小的舍入错误,toString()会获得lng1,现在又是一个数字,可能与toFixed()最初返回的数字略有不同,并将其转换回来到一个字符串。

如果您希望能够输出不错的数字,可以推迟toFixed()来电,直到结束:

...
var lat1Formatted = parseFloat(latlng1.split(', ')[0]).toFixed(5);
var lng1Formatted = parseFloat(latlng1.split(', ')[1]).toFixed(5);

document.getElementById('latlng').value = lat1Formatted + ', ' + lng1Formatted;