2014-04-17 8 views
19

In der CoffeeScript documentation on operators heißt es, dass Sie %% für echte mathematische Modulo verwenden können, aber es gibt keine Erklärung, warum dies anders ist als der "Modulo-Operator" % in JavaScript.Warum verwendet CoffeeScript %% für Modulo anstelle des Standard-JavaScript-Operators%

Weiter unten heißt es, a %% b in CoffeeScript entspricht dem Schreiben von (a % b + b) % b in JavaScript, aber dies scheint die gleichen Ergebnisse für die meisten einfachen Fällen zu produzieren.

Antwort

28

Ich fand die Antwort in einer anderen StackOverflow Frage und Antwort Javascript modulo not behaving und I wanted to share it für Leute, die wie ich nur nach einem "CoffeeScript" verwandte Erklärungen suchten und so eine harte Zeit haben, die richtige Antwort zu finden.

Der Grund für a %% b verwendet, die zu (a % b + b) % b kompiliert ist, dass für negative Zahl, wie -5 % 3, JavaScript -5 % 3 = 1 sein soll, eine negative Zahl -5 % 3 = -2 während die korrekte mathematische Antwort produzieren. Die angenommene Antwort bezieht sich auf an article on the JavaScript modulo bug, die es gut erklärt.

2

keinen Sinn für mich auf den ersten gemacht, so dass ich glaube, es ist ein Beispiel wie Modulo ist

check = (a,b) -> 
    c = (b*Math.floor(a/b)) + a%b 
    d = (b*Math.floor(a/b)) + a%%b 
    console.log(
    [c, c == a] 
    [d, d == a] 
) 

check 78, 33 # [ 78, true ] [ 78, true ] 
check -78, 33 # [ -111, false ] [ -78, true ] 

### 
78 mod 33 = 12 
-78 mod 33 = 21 

check: 78 = 33 * 2 + 12 
check: -78 = 33 * -3 + 21 
### 

Sieht braucht einen mathematischen Trick eine Formel für alle Zahlen statt einer für Negative und an zweiter Stelle zu verwenden, um der Lage zu sein, für Positives. Ich weiß nicht, ob es mehr als nur ein Trick ist und eine gewisse Bedeutung hat.

Verwandte Themen