2014-04-17 16 views
19

Trong số CoffeeScript documentation on operators, bạn có thể sử dụng %% cho modulo toán học thực sự, nhưng không giải thích tại sao điều này khác với toán tử modulo % bằng JavaScript.Tại sao CoffeeScript sử dụng %% cho modulo thay vì toán tử javascript chuẩn%

Hơn nữa xuống nó nói rằng a %% b trong CoffeeScript tương đương với viết (a % b + b) % b bằng JavaScript nhưng điều này dường như tạo ra kết quả tương tự cho hầu hết các trường hợp đơn giản.

Trả lời

28

Tôi đã tìm câu trả lời trong câu hỏi và câu trả lời khác của StackOverflow Javascript modulo not behavingI wanted to share it cho những người thích tôi chỉ tìm kiếm giải thích liên quan đến "CoffeeScript" và do đó khó tìm được câu trả lời đúng.

Lý do cho việc sử dụng a %% b mà biên dịch để (a % b + b) % b là đối với số âm, giống như -5 % 3, JavaScript sẽ tạo ra một số âm -5 % 3 = -2 trong khi câu trả lời toán học chính xác nên được -5 % 3 = 1.

Câu trả lời được chấp nhận đề cập đến an article on the JavaScript modulo bug giải thích rõ điều này.

2

Made không có ý nghĩa đối với tôi lúc đầu, vì vậy tôi tin rằng nó cần một ví dụ

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 
### 

Hình như modulo là một thủ thuật toán học để có thể sử dụng một công thức cho tất cả các số thay vì một cho âm và thứ hai cho tích cực. Không biết nếu nó nhiều hơn chỉ là một thủ thuật và có một số ý nghĩa nội tại mặc dù.

Các vấn đề liên quan