javascript - C# 和 Javascript 代码计算给出不同的结果

标签 javascript c# unity3d

我正在做一个 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,因为 14 被视为整数默认情况下,整数除法 1/4 得到 01/64 * n41/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/

相关文章:

javascript - 从嵌套函数内部访问 IIFE 变量

c# - 对于 C# 和 .NET,为什么运行时不自动异步运行?

c# - 碰撞检测不统一

javascript - 解析 Rails 中的 JSON 问题

javascript - ReactJS - 完全相同的元素在 chrome 浏览器中放大/缩小时表现不同

javascript - Node js异步 waterfall 未按顺序传递变量

unity3d - 如何在 Unity3d 中通过平面切割网格

c# - 如何为电子邮件消息中的占位符编码?

c# - AutoMapper 问题和映射 IEnumerable 集合

c# - 在 Unity 中,我可以在 Inspector 窗口中公开 C# *Properties* 吗?