![]() |
Десятичный дроби
Столкнулся с такой проблемой:
Код:
var i=0;0.1 0.2 0.3 0.4 0.5 НО, дальше начинаются "ошибки": 5.8 5.9 5.99999999999999 6.09999999999999 6.19999999999999 Я слышал, что AS работает капризно с дробными числами, но что он творит подобные ошибки в таких примитивных операциях, честно для меня это была новость. Собственно вопроса то никакого и нет, просто хотелось узнать Ваше мнение по данной проблеме. |
Всё, сношу флэш нафиг
А вобще - дежавю - это сбой в Матрице |
В результате срочно созваннного заседания, посвященного этой проблеме, решено было устроить опрос среди населения. На вопрос - "Как вы относитесь к подобному багу во флэше?", наша специальная комисия получила следующие ответы -
13,4 процента - "Первый раз слышу" 7,4 процента - "Не знаю..." 6,3 процента - "Такая тема уже обсуждалась на Флэшере 15,8 процентов - "Не надо использовать дроби во флэше" 16,6 процента - "Надо использовать код типа i+=1 j=i/10 trace(j);" 12,0 процента - "Надо деинсталирвать флэш" 47,5 процента - "Путин" 23,1 процента - "Не надо обращать внимания на мелочи" 5.99999999999999 процента - "Мне всё равно" В опросе приняло участие 1024 человека из 1063 регионов страны, разных возрастных групп и телосложения |
Со Флэшем все нормально, это нас в школе неправильно учили...
|
а может это их в школе не правильно учили?
|
Одно из решений:
var i=0; this.onEnterFrame=function():Void{ i+=0.1; i=Number(String(i)) trace(i); } |
Цитата:
|
Проблема действительно существует, я много раз с ней сталкивался. Решение одно - округлять. На каждом этапе вычисления.
|
Цитата:
Код:
var i=90;даже весело |
Смотрю народу понравилось предлагать решения проблемы (хотя я и не просил) :) Скажу честно некоторые варианты решения меня ужаснули. Что ж кому не лень предлагайте еще более извращенные варианты - с удовольствием на них посмотрю. В конце концов - это же раздел ФЛЕЙМ - можно ж то хоть здесь оторваться :D
|
a=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6...]
this.onEnterFrame=function():Void{ i+=1; j=a[i] trace(j); } |
this.onEnterFrame=function():Void{
i+=0.1; j=i+0.00000000000001; trace(j); } |
извращённые варианты предлагать?... нучтож, flash это готично :taunt:
var i=0; this.onEnterFrame=function():Void{ i+=0.1; if (i < 0.1) j = 0 if (i < 0.2) j = 0.1 if (i < 0.3) j = 0.2 if (i < 0.4) j = 0.3 if (i < *) j = * // до бесконечности можно ((: trace(j); } |
берем ПХП и пишем
Код:
$k=0.000000000000001;Код:
0.010000000000001Ну после всего этого мальчики/девочки идем учить мат. часть%). Читаем компьтерную литературу - лучше про ассемблер и представление вещественных чисем в компьютере, потом думаем потом опять читаем, опять думаем.... и так до тех пор пока не поймем куже таки девалась эта 0.00000000000001. |
2__i
Ну умный малый, куды бечь, компьютерную литературу читал, пхп знает, диагноз - гений |
Цитата:
|
А давайте конкурс: "предложи свой способ хранения дробей в памяти" :confused:
|
Цитата:
|
Код:
var i=0; |
нука.... а если так:
i=0 onEnterFrame=function(){ i+=0.1 trace(Math.cell(i)) } Да, кстати: не прикидывайтесь умными! непишите вы Void. и ; можно неставить в конце оператора. хм.. а может вы умные?:) не, у умных таких ошибок не возникает:) невобиду, но ето так. |
и че? не в обиду пишется раздельно, ты бы сначала русский выучил, прежде чем рассказывать программистам что писать, а что не писать!
|
Цитата:
Код:
**Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 4: There is no method with the name 'cell'.Исправляем на Math.ceil и видим в оутпуте: 1 1 1 1 1 1 1 1 1 1 2 2 2 2 ... :~) |
Цитата:
Но когда код становится посложнее, то привычка писать код правильно и указывать типы совсем не мешает :~) |
Цитата:
|
Цитата:
|
Цитата:
var m=Math.cos(Math.PI/2); и без того выдает m=6.12303176911189e-17; Проблема в том, что PI во флэше, естественно, не идеальное. Напиши: trace(Math.PI); В Output'е появится следующее: 3.14159265358979 Всего лишь 14 знаков после запятой. Достаточно? Нет. Потому что при этом пи флэш выдает то m, которое ты написал. Насколько я понимаю запись "е-17", это означает, что число умножено на 10 в минус семнадцатой степени. 6*10^-17 — почти ноль. Но не ноль. Вот 100 знаков после запятой: 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679 Этого, казалось, было бы достаточно. Нет. Флэшу все равно. Выражение Math.cos(*пи с сотней знаков*/2) дает то же самое. Может, в проге недостаточно знаков? :) Наверное, знаков там хватает (видимо, и пи у них выводится неполностью). Просто надо использовать Math.round() :) Кстати, если нужно 1 452 717 знаков после запятой - вам нужно скачать архив (673 Кб). |
Вложений: 1
Цитата:
|
| Часовой пояс GMT +4, время: 14:27. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.