Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> точность при вычислениях с плав. точкой 
V
    Опции темы
pythonwin
Дата 1.11.2006, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 1
Всего: 36



Всем привет!

помогите пожалуйста:

Код

alert(eval('-1.2')+1)

в результате получаю "-0.19999999999999996", хотя нужно "0.2"
PM WWW GTalk Jabber   Вверх
AKS
Дата 1.11.2006, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Код

alert((-1.2 + 1).toFixed(1));

PM MAIL   Вверх
pythonwin
Дата 1.11.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 1
Всего: 36



AKS, спасибо! smile
если сколько знаков после точки не известно?
PM WWW GTalk Jabber   Вверх
skyboy
Дата 1.11.2006, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



в принципе, известно: у тебя первое и второе слагаемое имеют вполне определенное количество цифр после точки, максимальное из которых и может служить параметром округления
PM MAIL   Вверх
AKS
Дата 1.11.2006, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



pythonwin
Цитата

если сколько знаков после точки не известно? 

Если неизвестно - надо узнать!
PM MAIL   Вверх
pythonwin
Дата 1.11.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 1
Всего: 36



Цитата(AKS @  1.11.2006,  17:12 Найти цитируемый пост)
Если неизвестно - надо узнать! 

а как?
PM WWW GTalk Jabber   Вверх
AKS
Дата 1.11.2006, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



pythonwin
Цитата

а как?

Взяв, например, длину строки после точки...
PM MAIL   Вверх
pythonwin
Дата 1.11.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 1
Всего: 36



решение:
Код

var n = new String('-1.2')
j=n.substr(n.indexOf('.',0)+1,n.length).length
x=eval(elem1.value) - 1
s=x.toFixed(j);

Всем спасибо! smile
AKS, +1 smile
PM WWW GTalk Jabber   Вверх
Zeroglif
Дата 1.11.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Number.prototype.toFixed в IE в некоторых местах поломан (баги реализации алгоритма), пользоваться нужно осторожно в зависимости от исходных циферок, с которыми приходится работать, к примеру:

Код

(-1.95 + 1).toFixed(1); // -0.9 FF, -1.0 IE
(-1.09 + 1).toFixed(1); // -0.1 FF, -0.0 IE
(0.85).toFixed(1);      //  0.8 FF,  0.9 IE
// и т.д. и т.п.


Полезное чтиво про округление.
PM MAIL WWW   Вверх
AKS
Дата 1.11.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif, решил, пока не поздно (пока не "перегрелся"), проконсультироваться. 
Пришел к выводу, что все из-за разного "округления" пятерки, так что-ли получается?
PM MAIL   Вверх
Zeroglif
Дата 1.11.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(AKS @  1.11.2006,  15:06 Найти цитируемый пост)
так что-ли получается?

Баги всё проклятые... smile
PM MAIL WWW   Вверх
SelenIT
Дата 1.11.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Zeroglif, а в последнем примере разве IE округлил 0.85 неправильно?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 1.11.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Все - не могу больше! Замучали цифры! Я взялся переделать функцию function toFix2(d) из обсуждения, ссылку на которое дал Zeroglif, но силы мои иссякли. Проверьте, кому не лень (я постарался "обозвать" локальные переменные так, чтоб полегче было):
Код

Number.prototype.toFixed = function(fractionDigits) { 

  if(!(fractionDigits = Math.abs(fractionDigits))) 
    return '' + Math.round(this);

  var pow = Math.pow(10, fractionDigits),

  returnString = '' + ((this < 0) ? Math.round(this*pow)/pow : Math.floor(this*pow)/pow), 

  match1 = returnString.match(/-?\d*?\./), 

  match2 = ('' + returnString.match(/\.\d*/)).substr(1);

  return ((!match1) ? returnString + '.' + ('' + pow).substr(1, fractionDigits) :

    match1 + match2 + ('' + pow).substr(1, fractionDigits - 2));


Испытывал, пока "чайник не закипел", на примерах с того обсуждения и от Zeroglif:
Код

alert((0.94).toFixed(0));
alert((0.95).toFixed(0)); 

alert((0.88).toFixed(0));
alert((1.88).toFixed(0));   

alert((-1.95 + 1).toFixed(1));
alert((-1.05 + 1).toFixed(1));
alert((0.85).toFixed(1));

Пробовал и другие примеры, но уже не "тяну" на здравые выводы...
PM MAIL   Вверх
SelenIT
Дата 2.11.2006, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



А я вот задумался над этим...
Цитата(pythonwin @  1.11.2006,  10:25 Найти цитируемый пост)

Цитата(AKS @   1.11.2006,  10:12 Найти цитируемый пост)

Если неизвестно - надо узнать!

а как?

...В итоге родилось такое чудовище. Работает оно только со строковым представлением числа и действует так: если в записи числа встречается последовательность нулей либо девяток длиннее заданного порога ("допустимой погрешности") - все, что за ней, просто обнуляется (в случае нулей) или дополняется до ближайшего старшего разряда (в случае девяток). Не знаю правда, насколько такое [censored] будет востребовано... но если будет, буду благодарен за предложения по приведению этого [censored] в человеческий вид smile
Код

Number.prototype.stripUnsignificant = function(n) {
   if (typeof n != 'number' || n < 2) return this;
   var str = ('' + this).replace('-',''), point = str.indexOf('.'),
       nines='', zeroes='', neg = (this>0 ? '' : '-'), test;
   str = str.replace('.','');
   if (point < 0) point = str.length;
   while (nines.length < n) { nines += '9', zeroes += '0' }
   test=str.indexOf(zeroes);
   if (test > -1) str = str.substr(0, test);
   test=str.indexOf(nines);
   if (test > -1) {
      // если 9-ка в старшем разряде, резервируем место для новой единицы
      if (test == 0) { test++; point++; str = '0' + str; }
      str = str.substr(0, test-1) + (str.substr(test-1,1)*1+1);
   }
   if (str.length > point) str = str.substr(0,point) + '.' + str.substr(point);
   else while (str.length < point) str += '0';

   return (neg+str)*1;
}

alert( [ (-99.999995).stripUnsignificant(2),
         (2.21499999999999).stripUnsignificant(6),
         (2365001).stripUnsignificant(2) ] )





--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 2.11.2006, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



SelenIT
Цитата

...предложения по приведению этого [censored] в человеческий вид

Я завтра попробую к этому всему вернуться. Сегодня еще "подташнивает" после вчерашней возни с циферками (нелюблю я их сегодня ;) )...

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0900 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.