我正在做一个 Unity 项目,我需要将 UTM 坐标转换为纬度和经度。我已经尝试了几种 C# 解决方案,但它们都不够准确。但我发现一些 Javascript 代码给出了我正在寻找的确切结果 ( https://www.movable-type.co.uk/scripts/latlong-utm-mgrs.html )。问题是,当我将代码转换为 C# 时,它给出了不同的结果。以下是我在其中看到问题的代码片段:
Javascript:
var a = 6378137;
var f = 1/298.257223563;
var e = Math.sqrt(f*(2-f));
var n = f / (2 - f);
var n2 = n*n, n3 = n*n2, n4 = n*n3, n5 = n*n4, n6 = n*n5;
var A = a/(1+n) * (1 + 1/4*n2 + 1/64*n4 + 1/256*n6);
还有我自己转换的C#代码:
var a = 6378137;
var f = 1 / 298.257223563;
var e = Math.Sqrt(f * (2 - f));
var n = f / (2 - f);
var n2 = n * n;
var n3 = n2 * n;
var n4 = n3 * n;
var n5 = n4 * n;
var n6 = n5 * n;
var A = a / (1 + n) * (1 + 1 / 4 * n2 + 1 / 64 * n4 + 1 / 256 * n6);
它们应该是相同的,但是A的值不同。在 Javascript
中,它是 6367449.145823415
(我想要的),但是 C#
给出了 6367444.6571225897487819833001
。我可以在我的项目中使用 Javascript
代码,但方便的是 Unity 去年就停止了对 Javascript
的支持。
两个函数的输入相同。这可能是什么问题?
最佳答案
你在最后一个表达式中有问题
var A = a / (1 + n) * (1 + 1 / 4 * n2 + 1 / 64 * n4 + 1 / 256 * n6);
在 C# 中,1/4 * n2
被评估为 0
,因为 1
和 4
被视为整数默认情况下,整数除法 1/4
得到 0
。 1/64 * n4
和 1/256 * n6
也会发生同样的事情。但是在 JavaScript 中只有 64 位 float ,所以 1/4
被评估为 0.25
。
可能的解决方法:
var A = a / (1 + n) * (1 + 1 / 4.0 * n2 + 1 / 64.0 * n4 + 1 / 256.0 * n6);
现在答案似乎完全一样。
注意:正如@Lithium 提到的,您可能会发现在数字末尾添加 d
而不是 .0
以将其表示为 double 更优雅
。
关于javascript - C# 和 Javascript 代码计算给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51879059/