Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 09.05.2016, 15:48
Новичок на форуме
Отправить личное сообщение для kv9923 Посмотреть профиль Найти все сообщения от kv9923
 
Регистрация: 09.05.2016
Сообщений: 4

Функция не работает, выдаёт roundPlus(2162.615, 2) = 2162.61 , а надо 2162.62.
Подскажите, в чем же ошибка ?
Ответить с цитированием
  #12 (permalink)  
Старый 09.05.2016, 17:35
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

правильное округление
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>

Последний раз редактировалось рони, 09.05.2016 в 17:37.
Ответить с цитированием
  #13 (permalink)  
Старый 09.05.2016, 18:16
Кандидат Javascript-наук
Отправить личное сообщение для aklis Посмотреть профиль Найти все сообщения от aklis
 
Регистрация: 27.04.2015
Сообщений: 99

Судя по всему это для рассчета денег.
Тогда до двух знаков можно так округлять, сместим точку, округлим в меньшую сторону и вернем точку назад :
Math.floor(n *100) /100
Ответить с цитированием
  #14 (permalink)  
Старый 09.05.2016, 18:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

aklis,
где 2162.62?
var n = 2162.615;  alert(Math.floor(n *100) /100);

Последний раз редактировалось рони, 09.05.2016 в 18:21.
Ответить с цитированием
  #15 (permalink)  
Старый 09.05.2016, 18:28
Кандидат Javascript-наук
Отправить личное сообщение для aklis Посмотреть профиль Найти все сообщения от aklis
 
Регистрация: 27.04.2015
Сообщений: 99

Пардон, присмотрелся и понял что ошибался, не для денег видимо, потому что в большую нужно. Тогда так:
function f(num, zeros) {
  var factor = +("1e" + zeros);
  return Math.ceil(num *factor) /factor;
};
Ответить с цитированием
  #16 (permalink)  
Старый 09.05.2016, 18:33
Кандидат Javascript-наук
Отправить личное сообщение для aklis Посмотреть профиль Найти все сообщения от aklis
 
Регистрация: 27.04.2015
Сообщений: 99

Надо отдохнуть, а то мозги заклинило и не могу понять, для денег таки в большую или меньшую надо?=) Щас еще подумал и уже выходит что в большую. Где-то недоплатишь потом и здравствуй пеня.
Ответить с цитированием
  #17 (permalink)  
Старый 09.05.2016, 18:42
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

Сообщение от aklis
потому что в большую нужно
нужно округлять как Math.round но он тут не сработает, а сработает код выше пост 12
Ответить с цитированием
  #18 (permalink)  
Старый 09.05.2016, 18:47
Кандидат Javascript-наук
Отправить личное сообщение для aklis Посмотреть профиль Найти все сообщения от aklis
 
Регистрация: 27.04.2015
Сообщений: 99

рони
Да, хорошая округлялка, спасибо, уже утащил в кладовку
Ответить с цитированием
  #19 (permalink)  
Старый 10.05.2016, 19:26
Кандидат Javascript-наук
Отправить личное сообщение для aklis Посмотреть профиль Найти все сообщения от aklis
 
Регистрация: 27.04.2015
Сообщений: 99

До меня только сейчас дошло что 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
Ответить с цитированием
  #20 (permalink)  
Старый 10.05.2016, 19:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124


Сообщение от aklis
До меня только сейчас дошло что Math.round вообщето сработает как надо в моей функции
Сообщение от рони
нужно округлять как Math.round но он тут не сработает, а сработает код выше пост 12
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск