2009-12-07 21 views
7

Tôi biết đọc số this Stackoverflow question rằng người khiếu nại sẽ xem số của bạn, quyết định xem điểm giữa là số chẵn hay lẻ và sau đó trả lại số chẵn. Số ví dụ là 2,5 được làm tròn thành 3. Tôi đã thử các thử nghiệm nhỏ của riêng mình để xem điều gì xảy ra, nhưng tôi chưa tìm thấy bất kỳ thông số kỹ thuật nào về điều này, hoặc thậm chí nếu nó nhất quán giữa các trình duyệt.Làm thế nào Close là Javascript Math.Round đến C# Math.Round?

Dưới đây là một ví dụ đoạn mã JavaScript sử dụng jQuery cho màn hình:

$(document).ready(function() { 
    $("#answer").html(showRounding()); 
}); 

function showRounding() { 
    var answer = Math.round(2.5); 
    return answer; 
} 

này trả về một '3'.

Điều tôi muốn biết là: Làm cách nào để làm tròn JavaScript trong tương đương với C#? Lý do tôi làm điều này là vì tôi muốn dùng một phương thức JavaScript sử dụng Math.Round và viết lại cùng một phương thức vào C# và muốn biết rằng tôi sẽ có thể nhận được kết quả tương tự sau khi làm tròn một số.

Trả lời

5

Dưới đây là the complete javascript specification cho Math.round(x):

15.8.2.15 tròn (x) Trả về giá trị Số đó là gần nhất với x và là bằng một số nguyên toán học. Nếu hai số nguyên Giá trị số đều bằng nhau gần với x, thì kết quả là giá trị số gần bằng + ∞. Nếu x đã là một số nguyên, kết quả là x.

  • Nếu x là NaN, kết quả là NaN.
  • Nếu x là +0, kết quả là +0.
  • Nếu x là −0, kết quả là −0.
  • Nếu x là + ∞, kết quả là + ∞.
  • Nếu x là −∞, kết quả là −∞.
  • Nếu x lớn hơn 0 nhưng nhỏ hơn 0,5, kết quả là +0.
  • Nếu x nhỏ hơn 0 nhưng lớn hơn hoặc bằng -0,5, kết quả là −0.

LƯU Ý 1 Math.round (3.5) trả về 4, nhưng Math.round (–3.5) trả về –3.

Chú thích 2 Giá trị của Math.round (x) là giống như giá trị của Math.floor (x + 0,5), trừ khi x là -0 hoặc nhỏ hơn 0 nhưng lớn hơn hoặc bằng -0,5; đối với những trường hợp này Math.round (x) trả về −0, nhưng Math.floor (x + 0.5) trả về +0.

The C# Language Specification không quy định bất kỳ thuật toán làm tròn cụ thể nào. Điều gần nhất chúng tôi có là tài liệu dành cho .NET Math.Round. Từ đó, bạn có thể thấy rằng một số trường hợp javascript không áp dụng (Math.Round chỉ xử lý số thập phân và tăng gấp đôi, không vô cùng) và quá tải của phương thức cho phép bạn kiểm soát nhiều hơn kết quả - bạn có thể chỉ định số chữ số thập phân trong kết quả và phương pháp làm tròn điểm giữa. Theo mặc định, Math.Round sử dụng 'làm tròn ngân hàng' (thậm chí).

2

Làm tròn của ECMAScript về cơ bản là ngây thơ asymmetric rounding (với kiểm tra bổ sung cho +-Infinity). WRT porting mã JavaScript của bạn để C# có lẽ bạn đang tốt nhất để tránh NET của Math.Round (vì nó là always symmetric) và sử dụng Math.Floor thay vì:

double d = -3.5d; 
double rounded = Math.Floor(d + 0.5); // -3 matches JavaScript's Math.round 

Nghĩa là, nếu bạn muốn thi đua nghiêm ngặt của ECMAScript của Math.round.

+0

Bạn đã đúng. Vui lòng xem thêm http://stackoverflow.com/questions/1870441/remove-all-attributes/1870487#1870487 – cletus

+0

Trong C#, bạn nên sử dụng Round with MidpointRounding.AwayFromZero để giữ cho các nhà phân tích kinh doanh và người quản lý của bạn luôn vui vẻ. Dường như, theo mặc định C# Round đang sử dụng làm tròn của ngân hàng với MidpointRounding.Even. Và tất nhiên, trong C# sử dụng Decimal cho tiền. Không chắc chắn, làm thế nào chính xác này sẽ được trong Javascript mặc dù, nhưng bạn không nên dựa vào Javascript anyway - máy chủ là cơ quan. – JustAMartin

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