1

Javascript 剰余 (またはモジュラス) 演算子を使用すると、非常に奇妙な問題が発生します。

setWidthボードの幅全体 (余白を除く) を取得し、値が左の領域に直接収まるようにする必要があります。

これは、以下の例では、 を結果でarea割ったときの余りが であることを意味します。setWidth0

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);

文字列から値を解析している理由は、実際にはページ上のテキスト ボックスから取得されるためです。

私の例 JSFiddleには 2 つの異なる例があり、1 つは期待どおりに動作しますが、もう 1 つは動作しません。唯一の違いは数字です。

上記の例では、値は次のようになります。

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)

私の例の 1 つが機能し、もう 1 つが機能しない理由を誰かが説明できる場合は、喜んで聞いてください。しかし、現時点では、なぜこれが機能しないのか理解できません...

何か案は?

4

2 に答える 2

3

modVal2.842170943040401e-14これは、浮動小数点で得られるもの0.00000000000002842170943040401とほぼ同じです。0

浮動小数点演算は奇妙で扱いにくい場合があります。十分な情報を得ていることを確認してください。

于 2013-10-30T16:53:35.230 に答える
0

JavaScriptの浮動小数点%はかなり奇妙です。

無限大もゼロも NaN も含まれない残りのケースでは、被除数 n と除数 d からの浮動小数点剰余 r は、数学的関係 r = n − (d × q) によって定義されます。ここで、qは、n/d が負の場合にのみ負になり、n/d が正の場合にのみ正になる整数であり、その大きさは n と d の真の数学的商の大きさを超えない範囲で可能な限り大きくなります。r が計算され、IEEE 754 round-to-nearest モードを使用して最も近い表現可能な値に丸められます。

ここで519 / 101.6は、5 を少し上回ります (5 と 6 の間です)。したがって、この場合の整数 "q" は5であり、101.6 * 5(508ほぼ) です。引き算の結果は です11.000000000000028

于 2013-10-30T16:56:36.810 に答える