Topic: JavaScript matematika

susidūriau su ganėtinai absurdiška situacija: imu du skaičius (130.7 ir 5.5) ir atlieku jų aritmetinę daugybą. ir kaip manot, kokį atsakymą pateikia JavaScript? =]
pateikia 718.8499999999999, o teisingas turėtų būti 718.85. ši situacija egzistuoja tam tikruose intervaluose su tam tikrais skaičiais po kablelio.
jei kasnors žinot logišką paaiškinimą, kodėl taip vyksta, su mielu noru išklausyčiau =]

Su sąlyga, kad šūdo nebus...

Re: JavaScript matematika

Logiškas paaiškinimas yra tas kad tu dirbi su realiais skaičiais, kur rezultatai yra apytiksliai.

šiaip čia ne JS problema, o aplamai visų kompiuterių visų laikų problema. Keista, kad susidūrei tik JS'e, nes šitas dalykas egzistuoja VISUR (-;

Plačiau: slankaus kablelio aritmetika (ir tikslumas) - http://en.wikipedia.org/wiki/Floating_point

Dar daugiau plačiosios informacijos:
Bendra teorija - http://docs.sun.com/source/806-3568/ncg_goldberg.html
PHP - http://php.net/manual/en/language.types.float.php
MySQL - http://dev.mysql.com/doc/refman/5.0/en/ … float.html
JavaScript - http://www.hunlock.com/blogs/The_Comple … _Reference
Excel - http://blogs.msdn.com/b/excel/archive/2 … swers.aspx

šitas dalykas dažniausiai aiškinamas pirmuose universitetų kursuose kalbant apie kompiuterio pagrindus. Gali būti, kad dabar apie tai jau kalbama ir mokykloje (-;

Re: JavaScript matematika

na floating point skaičius ir aritmetiką, bei šių skaičių tikslumą aš puikiai žinau ir tenka susidurt nuolat. aš nelabai suprantu, kodėl gaunami būtent tokie rezultatai:

130.7 * 5.5 = 718.8499999999999
230.7 * 5.5 = 1268.85
30.7 * 55.5 = 1703.85
70.7 * 55.5 = 3923.8500000000004
230.7 * 55.5 = 12803.849999999999

t.y. mane glumina tai, jog neaišku kada kokių rezultatų tikėtis. vieną kartą rezultatas apvalintas, kitą kartą - ne. nuo ko tai priklauso? nes tarkim paėmus tą pačią sandaugą (230.7 * 5.5).toFixed(15) aš gaunu taip pat neapvalintą 1268.849999999999909

taip pat tą pačia tendensiją pastebėjau ir ant Javos. keista, kad anksčiau to nepastebėjau =] o su php visada pateikia rezultatą X.85, kol jo nepatikslini ar kol jis neperžengia "protingų" ribų =]. tuomet jau kaip ir priklauso.

Su sąlyga, kad šūdo nebus...

Re: JavaScript matematika

Jeigu paskaitytum tas nuorodas kur daviau, tai suprastum kame yra reiškinio esmė - kad tam tikrus trupmeninius skaičius tiksliai išsaugoti dvejatainėje sistemoje su riboto ilgio žodžiais (registrais) - neįmanoma (-;

Atliekant slankaus kablelio operacijas, vienas iš veiksmų yra skaičiaus pastūmimas (shift). Pastūmus į atitinkamą pusę visą dvejatainį skaičių ir atstūmus atgal - dingsta tam tikri bit'ai, kurie pastūmimo metu pateko už registro ribos. Ir tikslus skaičius pematamas. Taip gaunamas tik apytikslis rezultatas. O su tuo gyventi reikia naudojant apvalinimą (-;

Dirbant su realiais (real/float) skaičiais visada turi tikėtis tik apytikslių operacijų. Jeigu labau svarbu tikslumas (finansai ar labai tiksli fizika/matematika) tai tada turi imtis atitinkamų metodikų, kaip įvertinti paklaidas.


Warning: count(): Parameter must be an array or an object that implements Countable in /home/pasokime/domains/mysql.lt/public_html/forumas/include/parser.php on line 820

Re: JavaScript matematika

http://forums.devarticles.com/javascrip … 36190.html

Problem solved

Re: JavaScript matematika

Sprendimą tai aš ir pats žinau, beje net ir paprastesnį =] mane domino pačio reiškinio esmė, nes kaip sakiau su php niekad negaudavau tokių rezultatų, o su JAVA/JS niekad nepataikiau ant tokių skaičių. Tiesa su java finansiniams duomenims išreikšti naudoju BigDecimal tipą, kuris automatiškai reikalauja nurodyt tikslumą, gal dėl to ir neaptikau javoj šio reiškinio =]

gerai, aiškiau viskas. ačiū minde, reik skaityt daugiau teorijos =]

Su sąlyga, kad šūdo nebus...