如何防止恼人的浮点连接

时间:2016-02-27 00:03:57

标签: javascript

我的一个项目中有一个函数可以进行一些矢量计算。最近我开始注意到结果的不一致性,当我去挖掘时,我发现在某些地方,JavaScript会执行连接而不是添加。在搜索时,我发现你可以通过添加parsefloat()来阻止它,以确保变量是浮点数。所以现在我有了这个:

function getsqSegDistID(p, p1, p2) {
    var x = parseFloat(p1.x),
        y = parseFloat(p1.y),
        dx = p2.x - x,
        dy = p2.y - y;
    if (dx !== 0 || dy !== 0) {
        var t = (parseFloat((p.x - x) * dx) + parseFloat((p.y - y) * dy)) / (parseFloat(dx * dx) + parseFloat(dy * dy));
        if (t > 1) {
            x = p2.x;
            y = p2.y;
        } else if (t > 0) {
            x = parseFloat(x) + parseFloat(dx * t);
            y = parseFloat(y) + parseFloat(dy * t);
        }
    }
    dx = p.x - x;
    dy = p.y - y;
    return parseFloat(dx*dx) + parseFloat(dy*dy);
}

查看我放入的所有parseFloat

所以我的问题是在每次添加之前添加一个parsefloat会显着降低该函数的性能。现在执行的时间比以前多5倍。

1。我必须在每次添加前添加一个parseFloat吗?还是有更好的方法?

2。我是一名C / Java开发人员,但我正在帮朋友写一些处理逻辑。那么为什么heck 没有JavaScript有某种形式的数据类型强制执行?

1 个答案:

答案 0 :(得分:2)

  1. 如果一个或多个操作数是字符串,JavaScript将尝试连接。您当然不需要每次都调用p1.x,只需确保在所有传递的变量上调用它。我看到您最初解析p1.yp,但不对p2private void btnCall_Click(object sender, EventArgs e) { var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost/RESTWS/v1/call"); httpWebRequest.ContentType = "application/json"; httpWebRequest.Method = "POST"; using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { string json = "request={\"target\":\"bridge\",\"operation\":\"makeCall\",\"params\":[\"" + Number + "\",3000000000000000012,true,0,null]}"; streamWriter.Write(json); streamWriter.Flush(); streamWriter.Close(); } this.Close(); } 中的值执行相同操作。

  2. JavaScript是一种解释型语言,因此是动态类型的。必须编译静态类型的语言;这只是语言设计中众多权衡之一。