Округление до нужного количества знаков после запятой
Привет всем! В отличии от PHP (функция round()), в яваскрипте нет функции округляющей до нужного знака после запятой. Есть только метод round, который округляет до целого числа.
Предлагаю Вам простую функцию, которая округляет до нужного знака.
function roundPlus(x, n) { //x - число, n - количество знаков
if(isNaN(x) || isNaN(n)) return false;
var m = Math.pow(10,n);
return Math.round(x*m)/m;
}
Предлагаю администрации портала внести эту функцию в список аналогов функций php, в качестве аналога функции round(). |
alert(123.3453346.toFixed(3));
|
ZoNT,
toFixed возвращает значение типа string: alert(typeof 123.3453346.toFixed(3)); // "string" Поэтому лучше использовать его в комбинации с parseFloat: alert(typeof parseFloat(123.3453346.toFixed(3))); // "number" |
Цитата:
|
честно говоря, не нашел метод toFixed в справочнике, потому что он не описан в методах объекта Math, а описывается в методах объекта Number, его как бы приблизили к методам типа toString, и т.д. и возвращает он строку, хотя логически это чисто математическая штука должна быть.
Я думаю, в любом случае. в разделе "аналоги функций PHP" нужно указать аналог функции round() с использованием toFixing. |
Цитата:
|
Kolyaj,
Цитата:
|
x.toFixed(n)/1;
так кажись проще |
Вот тоже не понимаю зачем округлять, если нужны дальнейшие вычисления. Тогда же ошибка будет накапливаться.
Какая разница сколько знаков хранится в памяти. А вот при выводе уже можно урезать. |
alert(typeof +3.3453346.toFixed(3)); // "number" |
Функция не работает, выдаёт roundPlus(2162.615, 2) = 2162.61 , а надо 2162.62.
Подскажите, в чем же ошибка ? |
правильное округление
kv9923,
если хочется правильное округление ... источник https://gist.github.com/andrew-alade...689745bc49d2b1
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
</head>
<body>
<script>
String.prototype.lpad = function (padding, length) {
var string = this;
while (string.length < length) {
string = padding + string;
}
return string;
}
Number.prototype.round = function(base) {
if (base == null || base < 0) {
return this;
}
var string = this.toString();
var point_index = string.indexOf(".");
if (point_index == -1) {
return this;
}
var symbol_index = point_index + 1 + base;
if (symbol_index >= string.length) {
return this;
}
var integer = parseInt(string.substring(0, point_index), 10);
var fractional = parseInt(string.substring(point_index + 1, point_index + 1 + base), 10) || 0;
var max_fractional = Math.pow(10, base);
var symbol = parseInt(string.charAt(symbol_index), 10);
if (symbol >= 5) {
if (base == 0) {
integer ++;
} else {
if (fractional + 1 == max_fractional) {
integer ++;
fractional = 0;
} else {
fractional ++;
}
}
}
return new Number(parseFloat(integer + "." + (fractional.toString().lpad("0", base))));
}
var a = 2162.615;
alert(a.round(2));
</script>
</body>
</html>
|
Судя по всему это для рассчета денег.
Тогда до двух знаков можно так округлять, сместим точку, округлим в меньшую сторону и вернем точку назад : Math.floor(n *100) /100 |
aklis,
:-? где 2162.62? var n = 2162.615; alert(Math.floor(n *100) /100); |
Пардон, присмотрелся и понял что ошибался, не для денег видимо, потому что в большую нужно. Тогда так:
function f(num, zeros) {
var factor = +("1e" + zeros);
return Math.ceil(num *factor) /factor;
};
|
Надо отдохнуть, а то мозги заклинило и не могу понять, для денег таки в большую или меньшую надо?=) Щас еще подумал и уже выходит что в большую. Где-то недоплатишь потом и здравствуй пеня.
|
Цитата:
|
рони
Да, хорошая округлялка, спасибо, уже утащил в кладовку:) |
До меня только сейчас дошло что Math.round вообщето сработает как надо в моей функции:)
function f(num, zeros) {
var factor = +("1e" + zeros);
return Math.round(num *factor) /factor;
};
f(123.124252,2) //123.12
f(123.125252,2) //123.13
|
:cray:
Цитата:
Цитата:
|
Дык работает же? Что не так там?
|
Цитата:
|
А, ну да, это число в двоичном представлении бесконечная дробь жеж. Спасибо.
|
да, округление из поста 12 точно работает. Спасибо автору.
Попутно, подскажите, как правильно перемножить числа для дальнейшего округления: 90*24.85*0.97=2169.405 // выдает калькулятор, excel и тд 90*24.85*0.97=2169.4049999999997 // выдает javascript и округлялка соответственно неверно работает. Вместо 2169.41, выдает 2169.40. |
округление чисел
kv9923,
а так?
Number.prototype.round = function(base) {
if (base == null || base < 0) return this;
var string = this.toString();
var point_index = string.indexOf(".");
if (point_index == -1) return this;
var symbol_index = point_index + 1 + base;
if (symbol_index >= string.length) return this;
var max_fractional = Math.pow(10, base);
var up = 0;
string = string.split("");
for (var i = string.length - 1; i >= symbol_index; i--) {
if (point_index == i) continue;
up = (string[i] = +string[i] + up) >= 5 ? 1 : 0;
string[i] %= 10
}
string.length = symbol_index;
return +(+string.join("") + up / max_fractional).toFixed(base)
};
var a = 90*24.85*0.97 ;
alert(a.round(2));
|
уже лучше, но 1*24.85*0.97=24.10 , а скрипт считает как 24.11.
|
kv9923,
неа 21.1045 что как раз и даст при округлении до второго знака 24.11 -- вы уж определитесь как вы хотите округлять и напишите функцию с нужными вам параметрами. |
помогите сделать "Округление к ближайшему целому" — наиболее часто используемое округление, как это описано в вики по слову "Округление". Есть конечно и другие методы, но требуется реализовать именно этот. Думаю многие пользователи будут благодарны.
Округление 21.1045 (и 21.104999) до сотых даст 21.10. Округление 21.1050 (и 21.114999) до сотых даст 21.11. |
kv9923,
для такого округления достаточно toFixed alert([21.1050.toFixed(2),21.1045.toFixed(2)] ); |
Цитата:
|
| Часовой пояс GMT +3, время: 09:32. |