Re: Как так? JavaScript
От: Blazkowicz Россия  
Дата: 21.09.07 09:53
Оценка: 1 (1)
Здравствуйте, onedes, Вы писали:

O>Результат: у IE: 99.99999999999998 у Opera: 99.99999999999999

O>PS:Странно даже тут опера оказалась точнее IE... респект опере =))
1) JavaScript это не Java
2) Разберись что такое числа с плавающей запятой и как они представляются в двоичном формате. Тогда ты поймешь что не все десяитичные дроби можно представить конечной записью в двоичном виде. И наоборот. То что мы получаев в двоичном виде не имеет конечного предствления в десятичной записи. Отсюда и подобные артефакты при вычислениях над нецелочисленными типами.
Как так? JavaScript
От: onedes  
Дата: 21.09.07 09:45
Оценка:
<script language="javascript">
    function calc(){
        var x1 = 110;
        var y1 = 1.1;
        alert(x1/y1);        //99.99999999999998....
    }
</script>


Как так???
Кто объяснит, может я где ошибся?

Результат: у IE: 99.99999999999998 у Opera: 99.99999999999999
PS:Странно даже тут опера оказалась точнее IE... респект опере =))

21.09.07 14:29: Перенесено модератором из 'Java' — Blazkowicz
Re[2]: Как так? JavaScript
От: onedes  
Дата: 21.09.07 10:20
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, onedes, Вы писали:


O>>Результат: у IE: 99.99999999999998 у Opera: 99.99999999999999

O>>PS:Странно даже тут опера оказалась точнее IE... респект опере =))
B>1) JavaScript это не Java
B>2) Разберись что такое числа с плавающей запятой и как они представляются в двоичном формате. Тогда ты поймешь что не все десяитичные дроби можно представить конечной записью в двоичном виде. И наоборот. То что мы получаев в двоичном виде не имеет конечного предствления в десятичной записи. Отсюда и подобные артефакты при вычислениях над нецелочисленными типами.

Понял, но несовсем понятно почему Опера и IE дают разные результаты.
Например: тот же стандартный калькулятор выдаёт 100

Да и C++ тоже не подвёл:


    DOUBLE x = 110, y=1.1;
    x = x / y;
    printf("Res: %f\r\n",x);

Результат: 100.000000

с JavaScript оч странно получается.

PS: я понимаю что Java это не JavaScript, но тут нет форума JScript
Re: Как так? JavaScript
От: sef  
Дата: 21.09.07 10:21
Оценка:
O>Результат: у IE: 99.99999999999998 у Opera: 99.99999999999999
O>PS:Странно даже тут опера оказалась точнее IE... респект опере =))
в Firefox2.0 (Windows) тоже 99.99999999999999
Re[3]: Как так? JavaScript
От: Blazkowicz Россия  
Дата: 21.09.07 10:24
Оценка:
Здравствуйте, onedes, Вы писали:

O>Понял, но несовсем понятно почему Опера и IE дают разные результаты.

Результат скорее всего один. Механизмы его вывода в десятичную запись разные.

O>Например: тот же стандартный калькулятор выдаёт 100

O>Да и C++ тоже не подвёл:
Давай, ты попробуешь освоить поиск. Эта тема в каждом форуме, да по несколько раз обсуждалась.

O>PS: я понимаю что Java это не JavaScript, но тут нет форума JScript

Есть.
Re[2]: Как так? JavaScript
От: TafT Россия  
Дата: 22.09.07 14:33
Оценка:
Здравствуйте, sef, Вы писали:


O>>Результат: у IE: 99.99999999999998 у Opera: 99.99999999999999

O>>PS:Странно даже тут опера оказалась точнее IE... респект опере =))
sef>в Firefox2.0 (Windows) тоже 99.99999999999999

и в Safari for win тоже )
Re: Как так? JavaScript
От: anonymous Россия http://denis.ibaev.name/
Дата: 23.09.07 09:49
Оценка:
Здравствуйте, onedes, Вы писали:

O>Результат: у IE: 99.99999999999998 у Opera: 99.99999999999999

O>PS:Странно даже тут опера оказалась точнее IE... респект опере =))

http://xpoint.ru/know-how/Articles/FloatingPointNumbers?comments
Re[3]: Как так? JavaScript
От: andrey.desman  
Дата: 24.09.07 01:09
Оценка:
Здравствуйте, onedes, Вы писали:

O>Понял, но несовсем понятно почему Опера и IE дают разные результаты.

O>Например: тот же стандартный калькулятор выдаёт 100

А ты попробуй посчитать на калькуляторе вот такое вот:
1/3 (выдаст 0.3333333...),
а потом умножь это обратно на 3
Калькулятор пытается отслеживать такие ситуации.

O>Да и C++ тоже не подвёл:



O>
O>    DOUBLE x = 110, y=1.1;
O>    x = x / y;
O>    printf("Res: %f\r\n",x);
O>

O>Результат: 100.000000

То, что printf вывела 100 — это плюс ей, но значит это лишь то, что printf вывела 100 А в памяти у тебя все равно не 100.
Посмотри значения под отладчиком:
x    99.999999999999986    double
y    1.1000000000000001    double
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.