2014-09-26 100 views
0

好日子,问题与.toFixed()导致

我仍然在学习JS和HTML,我发现了一些很有趣的,我

我使用谷歌地理编码脚本,并在创建的单击事件地图检索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位小数和哪能修复它

+0

这个问题可以帮助你http://stackoverflow.com/questions/11832914/round-至多在2个小数点的位置在JavaScript – 2014-09-26 09:28:11

回答

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; 
+0

这工作100%,并且实际上学会了我一些简单的事情以备将来参考 – 2014-09-26 11:20:33