根据Division,Javascript Remainder不正确

时间:2013-10-30 16:48:08

标签: javascript modulus

使用Javascript余数(或模数)运算符我有一个​​非常奇怪的问题。

我需要获得电路板的整个宽度(不包括边距),然后确保setWidth值直接适合左边区域。

这意味着,在下面的示例中,area除以setWidth时的余数应为0

Javascript代码:

var totalWidth = parseFloat('519');
var setWidth = parseFloat('101.6');
var leftMargin = parseFloat('11');
var rightMargin = parseFloat('0');

var area = (totalWidth - leftMargin) - rightMargin;    
console.log('area : ' + area);
//Incorrect Value given...
var modVal = area % setWidth;
console.log('modVal : ' + modVal);
//Correct value of 5...
var divisionVal = area / setWidth;
console.log('divisionVal : ' + divisionVal);

我从字符串中解析值的原因是因为它们实际上是从页面上的文本框中检索的。

在我的Example JSFiddle我有两个不同的例子,一个像我期望的那样工作,但另一个没有。唯一的区别是数字。

在上面的示例中,值应如下所示:

area = (519 - 11) - 0; //Should be 508 (and is)
modVal = 508 % 101.6; //Should be 0 (But isn't for some unknown reason)
divisionVal = 508 / 101.6; //Should be 5 (and is)

如果有人能向我解释为什么我的一个例子有效,另一个没有,那么我很乐意听到它。但目前我无法理解为什么这不起作用......

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

modVal在这里提供2.842170943040401e-140.000000000000028421709430404010差不多,因为您将获得浮点数。

浮点运算可能很奇怪或难以处理。确保您了解情况。

答案 1 :(得分:0)

JavaScript中的浮点%非常奇怪:

  

在其余情况下,无论是无穷大,也不是零,也不涉及NaN,来自被除数n和除数d的浮点余数r由数学关系r = n - (d×q)定义)其中q是一个整数,只有当n / d为负时才为负,只有当n / d为正时才为正,并且其大小尽可能大而不超过n和d的真数学商的大小。计算r并使用IEEE 754舍入到最接近模式四舍五入到最接近的可表示值。

所以在这里,519 / 101.6略高于5(介于5和6之间)。因此,在这种情况下,整数“q”是5,而101.6 * 5508(几乎)。减法的结果是11.000000000000028