Я в ситуации, когда функция JavaScript создает числа, такие как 2.5
. Я хочу, чтобы эти пять чисел округлялись до 2
, а не результат Math.round
, который всегда будет округлять в таких случаях (игнорируя четное нечетное правило), производя 2. Есть ли более элегантный способ сделать это, чем вычесть 0,01 от числа до округления? Благодарю.JavaScript: Округление вниз .5 Случаи
ответ
Просто отрицать ввод и вывод в 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>");
сделать это:
var result = (num - Math.Floor(num)) > 0.5 ? Math.Round(num):Math.Floor(num);
Это не то, что ищет ОП. Им нужна функция, которая будет определять, следует ли округлять вверх или вниз автоматически в зависимости от значения. – jfriend00
Спасибо, отредактировал ответ –
Другим способом существует, что это использовать действительные числа (вместо 0,2 использования 20 0,02 использование 2 и т.д.), а затем добавить переменную floatingPoints, которая будет делить результат (в вашем случай 2). В результате вы можете работать как число/(10^плавающие точки). Это решение широко распространено среди форекс-компаний.
По-прежнему существует (хорошая) вероятность ошибки при выполнении операций деления. – Pointy
Вы также можете использовать эту функцию, чтобы округлить, без дробной части и .5 вниз правило (только положительные числа):
function customRound(number) {
var decimalPart = number % 1;
if (decimalPart === 0.5)
return number - decimalPart;
else
return Math.round(number);
}
И извините за мой английский.
Если вы делаете «банковскую» математику, это фундаментальная ошибка для использования любой бинарной системы с плавающей запятой. – Pointy
Если вы пытаетесь сделать округление банкиров, это может помочь: http://stackoverflow.com/questions/3108986/gaussian-bankers-rounding-in-javascript –
Если вы * всегда * хотите округлить половинные случаи вниз (то есть, к отрицательной бесконечности), то, поскольку 'Math.round' всегда округляет половину случаев (т. е. к положительной бесконечности), решение так же просто, как отрицание ввода и вывода в' round': '- (Math.round (- значение)) '. –