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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Арифметика в JS, один из нас идиот 
:(
    Опции темы
Bastet
Дата 10.10.2005, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: нет
Всего: 6



Не знаю, у всех ли такие глюки, но на одном моем друге проверено.
Просто методом алерт получаю:
Код

alert (3*0.7);

Цитата
3*0.7 = 2.0999999..., однако
0.3*0.7 = 0.21


Мне-то лично такие его кульбиты параллельны... Но пишу вот обработчик формы (вычисление на основе введенных данных), перед заказчикам и будущими пользователями неудобно.
Можно ли это обойти цивилизованно (а не тупой проверкой на проблемные значения)? И если можно, то как?
--------------------
"I'm not bad. I'm just drawn that way" © Jessica RabbitСм.также: BB | ЖЖ | DA
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 10.10.2005, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



К сожалению нельзя конечным количеством бит представить любое число.
Числа с пл. точкой на самом деле съэмитированы.
Поэтому подобные неточности вообще не зависят от языка программирования, а являются особенностью нашего железного цифрового друга.

Обойти.... ну разве что написать свой класс чисел. И выполнять арифметические операции столбиком. Но вот беда мы и там не застрахованы. Хотя...

Код

function myMult(a,b)
{
  res=parseInt((a*100)+"")*parseInt((b*100)+"");
  return res/100;
}


Только операции с целыми числами дают точные результаты (пока мы не вышли за границы определённые количеством бит, используемых для хранения этого числа..)
Добавлено @ 23:08
Ссори за тупизну с parseInt просто на скорую руку не вспомню, как в целое число преобразовать плавающее ...



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Aliance
Дата 10.10.2005, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Цитата(sergej @ 11.10.2005, 00:06)
Ссори за тупизну с parseInt просто на скорую руку не вспомню, как в целое число преобразовать плавающее ...

parseFloat?
PM MAIL WWW ICQ Skype   Вверх
sergejzr
Дата 10.10.2005, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



неа parseFloat это строку в дес. дробь.
А надо дес. дробь в целое число (просто обрезать нули).

В С++ и Java:
double a=5.6;
int g=(int)a;


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Aliance
Дата 10.10.2005, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



>>>как в целое число преобразовать плавающее
>>>А надо дес. дробь в целое число

Противоречишь сам себе 8))
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 11.10.2005, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Одно из фундаментальных свойств дробных чисел: между двумя различными числами всегда существует третье, отличное от первых двух. Реализовать это не реально по определению, память конечна)

В JS, как в прочем почти везде, дробные числа представляються 64 битным числом, состоящим из знакового бита, мантиссы и экспоненты. Об этом много раз говорилось на форуме и даже в JS smile

При вычислениях дробные числа содержаться в 80 битных регистрах, т.е. точности хватает. После полученное число сохраняеться в 64 битное значение, при этом теряем в точности, получая максимально приближенное значение.

parseInt и parseFloat использовать не нужно, юзаем toFixed(<число знаков после запятой>);

Код
alert(0.7989889990.toFixed(2));



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Bastet
Дата 11.10.2005, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: нет
Всего: 6



Как преобразовать одно число в другое найду по справочнику...

Ясно одно: красивого пути решения проблемы нет.
sergej.z, наверное, так и придется.

Нужно для интереса попробовать в других языках умножать 3 на 0.7 smile
--------------------
"I'm not bad. I'm just drawn that way" © Jessica RabbitСм.также: BB | ЖЖ | DA
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 11.10.2005, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(Bastet @ 10.10.2005, 23:16)
Нужно для интереса попробовать в других языках умножать 3 на 0.7 smile

можно и не пробовать smile поюзай поиск по форуму. В каждом разделе Х бывал такой вопрос, почему язык Х врёт smile smile

Вот, точностью можешь вариировать. Параметр к toFixed - число занаков после запятой в наиболее "длинном" числе. Делить в конце ессно надо на 10 в степени это количество. Думаю разберёшься и так smile

Код

function myMult(a,b)
{
  res=a.toFixed(4)*b.toFixed(4)
  return res/10000;
}



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


 




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


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

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