2016-03-06 3 views
3

Я в ситуации, когда функция JavaScript создает числа, такие как 2.5. Я хочу, чтобы эти пять чисел округлялись до 2, а не результат Math.round, который всегда будет округлять в таких случаях (игнорируя четное нечетное правило), производя 2. Есть ли более элегантный способ сделать это, чем вычесть 0,01 от числа до округления? Благодарю.JavaScript: Округление вниз .5 Случаи

+6

Если вы делаете «банковскую» математику, это фундаментальная ошибка для использования любой бинарной системы с плавающей запятой. – Pointy

+1

Если вы пытаетесь сделать округление банкиров, это может помочь: http://stackoverflow.com/questions/3108986/gaussian-bankers-rounding-in-javascript –

+0

Если вы * всегда * хотите округлить половинные случаи вниз (то есть, к отрицательной бесконечности), то, поскольку 'Math.round' всегда округляет половину случаев (т. е. к положительной бесконечности), решение так же просто, как отрицание ввода и вывода в' round': '- (Math.round (- значение)) '. –

ответ

1

Просто отрицать ввод и вывод в Math.round:

var result = -Math.round(-num); 

Более подробно: в JavaScript Math.round обладает необычным свойством, что она округляет наполовину случаев по отношению к положительной бесконечности, независимо от того, являются ли они положительными или отрицательными. Так, например, 2.5 будет округлять до 3.0, но -2.5 будет округлять до -2.0. Это необычный режим округления: он гораздо более распространен для круглых половинных случаев либо от нуля (так что -2.5 будет округлять до -3.0) или до ближайшего четного целого.

Однако, у него есть приятное свойство, что это тривиально, чтобы адаптировать его к круглым случаям на полпути к отрицательной бесконечности вместо: если это то, что вы хотите, то все, что вам нужно сделать, это свести на нет как входа и выхода:

Пример:

function RoundHalfDown(num) { 
 
    return -Math.round(-num); 
 
} 
 

 
document.write("1.5 rounds to ", RoundHalfDown(1.5), "<br>"); 
 
document.write("2.5 rounds to ", RoundHalfDown(2.5), "<br>"); 
 
document.write("2.4 rounds to ", RoundHalfDown(2.4), "<br>"); 
 
document.write("2.6 rounds to ", RoundHalfDown(2.6), "<br>"); 
 
document.write("-2.5 rounds to ", RoundHalfDown(-2.5), "<br>");

2

сделать это:

var result = (num - Math.Floor(num)) > 0.5 ? Math.Round(num):Math.Floor(num); 
+0

Это не то, что ищет ОП. Им нужна функция, которая будет определять, следует ли округлять вверх или вниз автоматически в зависимости от значения. – jfriend00

+0

Спасибо, отредактировал ответ –

0

Другим способом существует, что это использовать действительные числа (вместо 0,2 использования 20 0,02 использование 2 и т.д.), а затем добавить переменную floatingPoints, которая будет делить результат (в вашем случай 2). В результате вы можете работать как число/(10^плавающие точки). Это решение широко распространено среди форекс-компаний.

+0

По-прежнему существует (хорошая) вероятность ошибки при выполнении операций деления. – Pointy

0

Вы также можете использовать эту функцию, чтобы округлить, без дробной части и .5 вниз правило (только положительные числа):

function customRound(number) { 
    var decimalPart = number % 1; 
    if (decimalPart === 0.5) 
     return number - decimalPart; 
    else 
     return Math.round(number); 
} 

И извините за мой английский.