Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.08.2010, 18:05
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 26.02.2010
Сообщений: 71

Работа с дробными числами
<script>

function xxx(b) {

alert(b);

if (b < 1) { b = b + 0.1; setTimeout(function() { xxx(b); }, 1000); }

}
</script>

<input type="button" value="Send" onclick="xxx(0.1)">

В алерте получаю -
0.1
0.2
0.3000...0004
0.4
0.5
0.6
0.7
0.7999...9999
0.8999...9999
0.9999...9999
1.0999...9999

Причём по всех браузерах одно и тоже.
Решил проблему так: b = (b*10 + 1)/10;
Но всё же интересно узнать, почему 0.2 + 0.1 != 0.3.
Ответить с цитированием
  #2 (permalink)  
Старый 22.08.2010, 22:51
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

http://www.rsdn.ru/article/alg/float.xml
Ответить с цитированием
  #3 (permalink)  
Старый 23.08.2010, 09:07
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 26.02.2010
Сообщений: 71

Можно даже проще -
alert(0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1)

получим 0.999...999;
А вот если проделать тоже самое в c#, то результат будет верный -
Response.Write(0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1)

получим 1.

Из той статьи -
Цитата:
То есть, с математической точки зрения, операция сложения чисел с плавающей запятой не ассоциативна: (a + b) + c != a + (b + c).
+ округление формата.
Более менее ясно с математической стороны, но с логической стороны не могу принять сей факт, в школе учили, что 0.1+0.1=0.2, а не 0.3.
Ответить с цитированием
  #4 (permalink)  
Старый 23.08.2010, 09:19
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

А еще в школе учили, что множество действительных (вещественных) чисел бесконечно, поэтому представить действительное число в двоичном виде можно только с ограниченной точностью (8, 16, 32, 64 байт).

Последний раз редактировалось Octane, 23.08.2010 в 09:22.
Ответить с цитированием
  #5 (permalink)  
Старый 23.08.2010, 09:33
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от DMH
А вот если проделать тоже самое в c#
в js числа занимают 8 байт (float64 (64 - количество бит)), в C# float занимает 32 байта, причем когда вы пишите "0.1" создается не float а double:
Response.Write(0.1 is float);
Response.Write("<br />");
Response.Write(0.1 is double);

т. е. 64 байта. Для создания float нужно "f" или "F" после числа поставить:
Response.Write(0.1f is float);


Неточные вычисления можно получить и в C#.
Ответить с цитированием
  #6 (permalink)  
Старый 23.08.2010, 13:49
DMH DMH вне форума
Аспирант
Отправить личное сообщение для DMH Посмотреть профиль Найти все сообщения от DMH
 
Регистрация: 26.02.2010
Сообщений: 71

В примере с c# можно и так написать - 0.1f+0.1f+..., получим ту же единицу, даже можем 12 нулей дорисовать, получим 1E-12, что для обычных вычислений вполне достаточно.
А с js нашёл пример прямо на этом сайте - http://javascript.ru/basic/types#netochnye-vychisleniya
Вобщем с float64 приходится отказываться от дроби, либо округлять неточности, короче дополнительная работа.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа эххххххх mycoding Оффтопик 28 10.02.2010 16:05
Работа Select в firefox Grid Firefox/Mozilla 0 05.02.2010 17:42
работа с файлами ashedow Общие вопросы Javascript 3 14.12.2009 12:15
небольшая работа - интерфейс в ява скрипте :) int9 Работа 0 08.12.2008 22:51
Работа с данными, введенными в форме Nubi jQuery 5 01.12.2008 16:31