Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.08.2012, 12:31
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 181

Глюк с математикой
сделал функцию, которая принимает на вход размер файла и разбивает его на группы по три цифры:
function file_size_formatter (cellvalue) {
        cellvalue = cellvalue.toString().match(/\d+/);
        cellvalue = cellvalue[0].toString();
        var l = cellvalue.length;
        var z = Math.floor(l / 3);
        var i = 0;
        var re = '';
        while (i < z) {
            re += '(\\d{3})'
            i++;
        }
        re = '(\\d{0,3})' + re + '$';
        re = new RegExp(re);
        var matches = cellvalue.match(re)
        i = 1;
        cellvalue = '';
        while (i < z + 2) {
            cellvalue += matches[i] + ' ';
            i++;
        }
        return cellvalue + 'B';
    }

решил проверить, как функция обработает значения различной длины, ведь размер файла может оказаться весьма большим (да и мало ли какие числа придется вжизни встречать).
Передаваемое значение -> Результат
9999999999999998 -> 9 999 999 999 999 998
9999999999999999 -> 10 000 000 000 000 000
10000000000000001 -> 10 000 000 000 000 000
10000000000000002 -> 10 000 000 000 000 002
99999999999999999 -> 100 000 000 000 000 000
99999999999999990 -> 99 999 999 999 999 980
99999999999999998 -> 100 000 000 000 000 000
99999999999999997 -> 100 000 000 000 000 000
Числа меньше 9999999999999999 вроде нормально ведут себя.
И сервак и клиент под управлением Ubuntu. Это глюк убунты или это вообще глюк всех систем?
Ответить с цитированием
  #2 (permalink)  
Старый 16.08.2012, 12:35
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Подозреваю, что это ограничения точности вещественной арифметики.

Лучше работайте со строками, разделяя разряды с помощью регулярных выражений.
Ответить с цитированием
  #3 (permalink)  
Старый 16.08.2012, 12:43
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 181

Честно, я перепробовал множество различных вариантов регулярок, но проблема заключается в том, что необходим поиск с конца, а судя по всему регулярки в JavaScript не имеют такого свойства...
Ответить с цитированием
  #4 (permalink)  
Старый 16.08.2012, 13:25
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 181

да моя функция тоже выполняет в принципе верное преобразование, вопрсо был в основном с том, что некоторые большие числа преобразуются неверно самой системой...
а чтобы решить проблему с этими числами, ябы мог просто разбить число как строку на такие числа, которые не будут содержать ошибку и потом с ними работать.
А за примеры регулярок спасибо. Буду иметь ввиду.
Ответить с цитированием
  #5 (permalink)  
Старый 16.08.2012, 15:56
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Число разделённое пробелом
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #6 (permalink)  
Старый 16.08.2012, 17:09
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Это не глюк, а фича арифметики чисел с плавающей запятой, как верно заметил B@rmaley.e><e. В учебнике об этом написано:
http://learn.javascript.ru/number#%D...%D 0%B8%D1%8F
В этом формате чисел можно точно записать без перерыва целые числа до Math.pow(2, 53) включительно, или 9007199254740992. Math.pow(2, 53)+1 - наименьшее натуральное число, которое нельзя записать точно.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странный глюк при работе с JQuery Kirill Tsvetkov Events/DOM/Window 1 13.03.2012 21:49
Глюк firebug'а trikadin Оффтопик 23 16.01.2012 14:04
RegExp глюк пробелы портят всё scuter Общие вопросы Javascript 4 01.08.2011 23:19
Глюк в Опере: expected identifier, got keyword 'new' Vulkan Opera, Safari и др. 4 19.12.2010 11:38
Возникает глюк при использовании двух плагинов dummer jQuery 5 23.12.2008 20:26