Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.10.2012, 03:23
Аватар для antonM
Кандидат Javascript-наук
Отправить личное сообщение для antonM Посмотреть профиль Найти все сообщения от antonM
 
Регистрация: 11.08.2011
Сообщений: 103

Инкремент числа с плавающей точкой
Объясните странное поведение операций с числами с плавающей точкой.
Мне надо в цикле производить увеличение целой части исходного числа на 1. Если, например, число от 11 до 15, то десятичная часть через определенный шаг цикла стает больше исходной. Пример:
var numsList = [];
var num = 12.001;
    
    for (var i = 0; i <= 5; i++) {
      numsList.push(num++);
    }
alert(numsList);

В пример, числа нормально увеличиваются до 15.001, затем получаем 16.000999999999998 и т.д.
Надо чтобы десятичная часть оставалась постоянной. Можно ли как-то решить проблему?
Ответить с цитированием
  #2 (permalink)  
Старый 16.10.2012, 03:38
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Округлять до нужного знака, без вариантов.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 16.10.2012, 04:29
Аватар для antonM
Кандидат Javascript-наук
Отправить личное сообщение для antonM Посмотреть профиль Найти все сообщения от antonM
 
Регистрация: 11.08.2011
Сообщений: 103

Спасибо большое за пример реализации!
Я так понимаю это особенность вычислительного движка JS.
А такой вариант имеет право на жизнь?:
var numsList = [];
var num = 12.001;
var digits = /(?:\.)(\d+)/.exec(num);
    for (var i = 0; i <= 5; i++) {
      if (digits === null) {
        numsList.push(num++);
      } else {
        numsList.push((num++).toFixed(digits[1].length) * 1);
      }
    }
alert(numsList);
alert(typeof numsList[5]);
Ответить с цитированием
  #4 (permalink)  
Старый 16.10.2012, 04:45
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Дзен-трансгуманист, чего-то я не особо вдупляю - накой такие сложности в твоей функции?

(function(a){
    window.alert = function(){
        a(Array.prototype.slice.call(arguments).join('\n'))
    }
}(window.alert))

function maxFraction (value, digits) {
 
  var fixed = (+value).toFixed(digits);
  var i = fixed.length - 1;
 
  loop: while (true) {
 
    switch (fixed.charAt(i)) {
 
    case "0": i--; continue;
    case ".": i--; break loop;
    }
 
    break;
  }
 
  return fixed.slice(0, i+1);
}

Number.prototype.round = function(p){ //почему не так?
  return +this.toFixed(p)
}

num = 0.1 + 0.2;

alert(
  num,
  maxFraction(num, 1),
  num.round(1),
  maxFraction(num+99, 1),
  (num+99).round(1),
  maxFraction(num, 0),
  num.round(),
  maxFraction(num, 5),
  num.round(5)
)
__________________
29375, 35

Последний раз редактировалось Aetae, 16.10.2012 в 05:10.
Ответить с цитированием
  #5 (permalink)  
Старый 16.10.2012, 05:01
Аватар для antonM
Кандидат Javascript-наук
Отправить личное сообщение для antonM Посмотреть профиль Найти все сообщения от antonM
 
Регистрация: 11.08.2011
Сообщений: 103

В моей задаче есть два условия:
1. количество десятичных знаков наперед неизвестно (количество должно извлекаться из исходного числа)
2. должно возвращаться число (не строка)

Последний раз редактировалось antonM, 16.10.2012 в 05:03.
Ответить с цитированием
  #6 (permalink)  
Старый 16.10.2012, 05:06
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Сообщение от antonM Посмотреть сообщение
В моей задаче есть два условия:
1. количество десятичных знаков наперед неизвестно
2. должно возвращаться число (не строка)
Печально. Считай кол-во знаков базового числа и по нему округляй.
Xотя, в принципе, погрешность, если вычисления не идут подряд, накапливаться не будет, а потому достаточно округлять до десяти знаков - лишнее отбросится:

(function(a){
    window.alert = function(){
        a(Array.prototype.slice.call(arguments).join('\n'))
    }
}(window.alert))

Number.prototype.round = function(p){ 
  return +this.toFixed(p)
}
num = 0.1 + 0.2;

alert(
  num,
  num.round(10)
)
__________________
29375, 35

Последний раз редактировалось Aetae, 16.10.2012 в 05:10.
Ответить с цитированием
  #7 (permalink)  
Старый 16.10.2012, 05:12
Аватар для antonM
Кандидат Javascript-наук
Отправить личное сообщение для antonM Посмотреть профиль Найти все сообщения от antonM
 
Регистрация: 11.08.2011
Сообщений: 103

Спасибо. Вопрос вычислений не стоит. Надо заполнить диапазон ячеек инкрементным набором чисел отталкиваясь от числа в первой ячейке. Соответственно все должно быть красиво без внезапных выскакиваний чисел с умопомрачительным количеством десятичных знаков. Что-то на подобии того, как это делается аутофиллером в Экселе или ООО Кальк.
Ответить с цитированием
  #8 (permalink)  
Старый 16.10.2012, 11:09
Аватар для Maxmaxmахimus
司会
Отправить личное сообщение для Maxmaxmахimus Посмотреть профиль Найти все сообщения от Maxmaxmахimus
 
Регистрация: 29.02.2012
Сообщений: 198

сделай тустринг, то что ДО точки преврати в число, инкриментируй, потом сделай тустринг, и вставь до точки в предыдущей строке, потом сделай пфрсфлоат. КЭП
Ответить с цитированием
  #9 (permalink)  
Старый 16.10.2012, 11:39
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от antonM
Объясните странное поведение операций с числами с плавающей точкой.
IEEE 754

Сообщение от antonM
Спасибо. Вопрос вычислений не стоит. Надо заполнить диапазон ячеек инкрементным набором чисел отталкиваясь от числа в первой ячейке. Соответственно все должно быть красиво без внезапных выскакиваний чисел с умопомрачительным количеством десятичных знаков. Что-то на подобии того, как это делается аутофиллером в Экселе или ООО Кальк.
не понял, в чем проблема. Уже объяснили как это сделать.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 16.10.2012 в 11:50.
Ответить с цитированием
  #10 (permalink)  
Старый 16.10.2012, 14:16
Аватар для antonM
Кандидат Javascript-наук
Отправить личное сообщение для antonM Посмотреть профиль Найти все сообщения от antonM
 
Регистрация: 11.08.2011
Сообщений: 103

nerv_, за ссылочку спасибо. Вопрос собственно уже решен
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите составить регулярное выражение для числа с плавающей точкой boomrest Общие вопросы Javascript 4 25.02.2015 11:17
Числа в поле для вычисления sergey-16a1 Javascript под браузер 5 19.08.2010 17:29
Точность вычисления чисел с плавающей запятой Mihas2 Общие вопросы Javascript 2 19.01.2010 16:32
число 76.4705882.. сделать 76.47? (числа всегда разные) TongaG Ваши сайты и скрипты 3 19.01.2010 07:35
10-ти байтные числа с плавающей точкой serzh44 Общие вопросы Javascript 10 21.04.2008 13:03