{"id":2950,"date":"2014-05-12T09:00:02","date_gmt":"2014-05-12T07:00:02","guid":{"rendered":"https:\/\/blogs.ua.es\/pi\/?p=2950"},"modified":"2025-02-17T18:03:36","modified_gmt":"2025-02-17T17:03:36","slug":"la-precision-en-javascript","status":"publish","type":"post","link":"https:\/\/blogs.ua.es\/pi\/2014\/05\/12\/la-precision-en-javascript\/","title":{"rendered":"La precisi\u00f3n en JavaScript"},"content":{"rendered":"<p>El siguiente problema no es s\u00f3lo de JavaScript, afecta a todos los lenguajes de programaci\u00f3n, pero es muy f\u00e1cil de comprobar en JavaScript.<\/p>\n<p>Abre una consola de JavaScript en un navegador y escribe:<\/p>\n<p>console.log(0.1*0.2);<\/p>\n<p>La respuesta deber\u00eda ser 0.02, pero aparece\u00a00.020000000000000004.<\/p>\n<p>&nbsp;<\/p>\n<p>Escribe:<\/p>\n<p>console.log(0.1+0.2);<\/p>\n<p>La respuesta deber\u00eda ser 0.3, pero aparece\u00a00.30000000000000004.<\/p>\n<p>&nbsp;<\/p>\n<p>Con el resultado anterior, si escribes:<\/p>\n<p>console.log((0.1+0.2) == 0.3);<\/p>\n<p>Lo normal ser\u00eda esperar que apareciese true, pero aparece false.<\/p>\n<p>&nbsp;<\/p>\n<p>Escribe:<\/p>\n<p>console.log(23*1.40);<\/p>\n<p>La respuesta deber\u00eda ser 32.2, pero aparece\u00a032.199999999999996.<\/p>\n<p>&nbsp;<\/p>\n<p>\u00bfDivertido? Pues no, porque si no se controla, se puede convertir en un verdadero problema.<\/p>\n<p>La raz\u00f3n es bien sencilla: el problema est\u00e1 en el formato <a href=\"https:\/\/en.wikipedia.org\/wiki\/IEEE_754#Basic_formats\">IEEE 754<\/a> que se emplea para representar los n\u00fameros en \u00abcoma flotante\u00bb, los n\u00fameros reales, los n\u00fameros con decimales.<\/p>\n<p>Un ejemplo para que se entienda bien: el n\u00famero 0.1 se escribe as\u00ed porque usamos base 10. En forma de fracci\u00f3n, ese n\u00famero se representa como 1\/10. Como el denominado coincide con la base, la representaci\u00f3n es directa: 10 elevado a -1, es decir, 0.1.<\/p>\n<p>\u00bfC\u00f3mo se representa el n\u00famero 1\/3 en base 10? No se puede, es una secuencia de infinitos n\u00fameros: 0.3333333333&#8230;<\/p>\n<p>Sin embargo, 1\/3 en base 3 se representa como 0.1, es decir, 3 elevado a -1.<\/p>\n<p>Los ordenadores emplean la base 2: algunos n\u00fameros se puede representar con toda precisi\u00f3n, sin embargo otros necesitan infinitos decimales.<\/p>\n<p>La soluci\u00f3n a este problema est\u00e1 en emplear alg\u00fan tipo de dato alternativo a trav\u00e9s de alguna librer\u00eda, como por ejemplo <a href=\"https:\/\/github.com\/dtrebbien\/BigDecimal.js\">BigDecimal.js<\/a>. Pero cuidado, esto har\u00e1 que los c\u00e1lculos sean mucho m\u00e1s lentos.<\/p>\n<p>Y el que quiera aprender m\u00e1s, la gu\u00eda definitiva:\u00a0<a href=\"http:\/\/docs.oracle.com\/cd\/E19957-01\/806-3568\/ncg_goldberg.html\">What Every Computer Scientist Should Know About Floating-Point Arithmetic<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El siguiente problema no es s\u00f3lo de JavaScript, afecta a todos los lenguajes de programaci\u00f3n, pero &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"more-link\" href=\"https:\/\/blogs.ua.es\/pi\/2014\/05\/12\/la-precision-en-javascript\/\"> <span class=\"screen-reader-text\">La precisi\u00f3n en JavaScript<\/span> Read more \u2192<\/a><\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[6231,4803,380566],"class_list":["post-2950","post","type-post","status-publish","format-standard","hentry","category-general","tag-error","tag-javascript","tag-precision"],"_links":{"self":[{"href":"https:\/\/blogs.ua.es\/pi\/wp-json\/wp\/v2\/posts\/2950","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.ua.es\/pi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.ua.es\/pi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.ua.es\/pi\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.ua.es\/pi\/wp-json\/wp\/v2\/comments?post=2950"}],"version-history":[{"count":3,"href":"https:\/\/blogs.ua.es\/pi\/wp-json\/wp\/v2\/posts\/2950\/revisions"}],"predecessor-version":[{"id":3270,"href":"https:\/\/blogs.ua.es\/pi\/wp-json\/wp\/v2\/posts\/2950\/revisions\/3270"}],"wp:attachment":[{"href":"https:\/\/blogs.ua.es\/pi\/wp-json\/wp\/v2\/media?parent=2950"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.ua.es\/pi\/wp-json\/wp\/v2\/categories?post=2950"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.ua.es\/pi\/wp-json\/wp\/v2\/tags?post=2950"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}