Насколько близок Javascript Math.Round к C # Math.Round? - PullRequest
7 голосов
/ 08 декабря 2009

Я знаю, прочитав этот вопрос Stackoverflow , что компилятор посмотрит на ваше число, решит, является ли средняя точка четным или нечетным числом, а затем вернет четное число. Номер примера был 2.5, который округлился до 3. Я попробовал свои собственные маленькие эксперименты, чтобы увидеть, что происходит, но мне еще предстоит найти какие-либо спецификации по этому поводу, или даже если это будет согласовано между браузерами.

Вот пример фрагмента JavaScript, использующего jQuery для отображения:

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

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

Возвращает «3».

Я хотел бы знать следующее: насколько близко округление в JavaScript к эквиваленту C #? Причина, по которой я это делаю, заключается в том, что я хотел бы взять метод JavaScript, который использует Math.Round, и переписать этот же метод в C #, и хотел бы знать, что я смогу получить те же результаты после округления числа.

Ответы [ 2 ]

5 голосов
/ 08 декабря 2009

Вот полная спецификация javascript для Math.round(x):

15.8.2.15 round (x) Возвращает числовое значение, наиболее близкое к x и являющееся равно математическому целому числу. Если два целых числа равны близко к х, то результатом является Числовое значение, которое ближе к + ∞. Если х уже является целым числом, результат х.

  • Если x равен NaN, результат равен NaN.
  • Если x равен +0, результат равен + 0.
  • Если x равен −0, результат равен −0.
  • Если x равен + ∞, результат равен + ∞.
  • Если x равен −∞, результат равен −∞.
  • Если х больше 0, но меньше чем 0.5, результат + 0.
  • Если x меньше 0, но больше или равен -0,5, результат это -0.

ПРИМЕЧАНИЕ 1 Math.round (3.5) возвращает 4, но Math.round (–3,5) возвращает –3.

ПРИМЕЧАНИЕ 2. Значение Math.round (x): такой же, как значение Math.floor (x + 0.5), кроме случаев, когда x равен −0 или меньше 0, но больше или равно -0,5; для этих случаев Math.round (x) возвращает -0, но Math.floor (x + 0.5) возвращает + 0.

Спецификация языка C # не предусматривает какого-либо конкретного алгоритма округления. Самое близкое, что у нас есть, - это документация для .NET Math.Round. Из этого вы можете видеть, что некоторые случаи javascript не применяются (Math.Round обрабатывает только десятичные и двойные, а не бесконечность), а перегрузки метода дают вам гораздо больший контроль над результатом - вы можете указать число дробные цифры в результате и метод округления средней точки. По умолчанию Math.Round использует «округление банкира» (для выравнивания).

3 голосов
/ 08 декабря 2009

Округление ECMAScript в основном наивное асимметричное округление (с добавленными проверками для +-Infinity). WRT портируя ваш код JavaScript на C #, вероятно, лучше всего избегать .NET Math.Round (так как он всегда симметричный ) и использовать вместо него Math.Floor:

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

То есть, если вы хотите строгую эмуляцию ECMAScript Math.round.

...