2017-03-08 33 views
0

我遇到了一些麻烦,我正在制作一个小设备,它旨在执行所有的计算,以便为一个吉他构建完美的指板。jQuery Math Formula问题 - 不正确的结果或NaN

http://codepen.io/JTBennett/pen/xqgGER

该计划是在codepen,到目前为止,左半边(FRET距离计算)工作正常,尽管意大利面......我累了。

但我在与右侧的最终计算(formula2)一个问题:

$("#fc_calc2").click(function() { 

    var T = $("#frN_12").html() 
    var St = $("input[id='St']").val() 
    var Sn = $("input[id='Sn']").val() 
    var X = (T)/((St/Sn) - 1) 
    $("#formula1").text(X.toFixed(3)) 

    var Rn = $("input[id='Rn']").val() 
    var D = $("input[id='radius']").val() 
    var Rd = ((Rn * (X + D))/X) 
    $("#formula2").text(Rd.toFixed(3)); 
    }); 

你可以用下面的值重现该问题:

Scale Length = 25.1 (You must press this button to calculate the left side first) 

(E to E @ Nut) = 1.406 
(E to E @ 12th) = 1.719 
(Nut Radius) = 12 
(Radius Point) = 18.825 

问题礼物在公式2字段中。用带小数点的半径点值,结果为NaN。用整数,它只是重复了螺母半径(12)的值。

我再次检查我的公式是否正确 - 您可以在此处看到基础:http://www.stewmac.com/How-To/Online_Resources/Neck_Building_and_Repair_and_Setup/Compound_Radius_Explained.html 在页面底部,问题出现在第二个公式(2)中。

任何想法这里发生了什么?我不是世界上最伟大的数学魔术师,所以任何帮助将不胜感激!

问候, 乔尔

+1

'.VAL()'总是返回一个字符串** **。因此'(X + D)'子表达式将执行字符串连接,而不是数字加法。 – Pointy

+0

'val()'返回一个字符串。您需要使用'parseFloat()'将其转换为可用于计算的浮点数 –

+0

具有**没有**与jQuery相关 – vsync

回答

2

更改以下行:

var Rn = $("input[id='Rn']").val() 
var D = $("input[id='radius']").val() 
var St = $("input[id='St']").val() 
var Sn = $("input[id='Sn']").val() 

var Rn = parseFloat($("input[id='Rn']").val()); 
var D = parseFloat($("input[id='radius']").val()); 
var St = parseFloat($("input[id='St']").val()); 
var Sn = parseFloat($("input[id='Sn']").val()); 

,然后再试一次。

说明:NaN (Not-a-Number)是一个怪异的全局对象,在JavaScript中经常返回一些数学运算失败。此属性表示一个值不是合法编号。

+0

第一部分的三行也是:var T','var St'和'var Sn'。 – Santi

+2

'parseInt()'可能不是正确的选择;要么是'parseFloat()',要么更好,只是一元''''操作符。 – Pointy

+0

感谢您的快速响应 - parsefloat选项完美解决 – Joel

3

val()返回一个字符串。添加两个字符串只是连接它们。您可以使用一元运算符+将所有数字字符串转换为实际的浮点数,因为在单独的注释中提到了Pointy

var a = "1"; 
var b = "2"; 
console.log(a+b); //12 
var a = +"1"; 
var b = +"2"; 
console.log(a+b); //3 

$("#fc_calc2").click(function() { 

    var T = +$("#frN_12").html() 
    var St = +$("input[id='St']").val() 
    var Sn = +$("input[id='Sn']").val() 
    var X = (T)/((St/Sn) - 1) 
    $("#formula1").text(X.toFixed(3)) 

    var Rn = +$("input[id='Rn']").val() 
    var D = +$("input[id='radius']").val() 
    var Rd = ((Rn * (X + D))/X) 
    $("#formula2").text(Rd.toFixed(3)); 

}); 
+0

非常感谢您的快速响应 - 我采用了parsefloat路径,但在这个和我的JSON项目之间,我开始将控制台看作一个非常有用的工具:} – Joel

+0

是的,它的救星:P –