Глюк с математикой
сделал функцию, которая принимает на вход размер файла и разбивает его на группы по три цифры:
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. Это глюк убунты или это вообще глюк всех систем? |
Подозреваю, что это ограничения точности вещественной арифметики.
Лучше работайте со строками, разделяя разряды с помощью регулярных выражений. |
Честно, я перепробовал множество различных вариантов регулярок, но проблема заключается в том, что необходим поиск с конца, а судя по всему регулярки в JavaScript не имеют такого свойства...
|
да моя функция тоже выполняет в принципе верное преобразование, вопрсо был в основном с том, что некоторые большие числа преобразуются неверно самой системой...
а чтобы решить проблему с этими числами, ябы мог просто разбить число как строку на такие числа, которые не будут содержать ошибку и потом с ними работать. А за примеры регулярок спасибо. Буду иметь ввиду. |
|
Это не глюк, а фича арифметики чисел с плавающей запятой, как верно заметил 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 - наименьшее натуральное число, которое нельзя записать точно. |
Часовой пояс GMT +3, время: 18:38. |