Disclaimer: Acest post nu este pentru acei dintre oameni care nu cunosc magia limbajelor de programare.
Ce se tot dau mari calculatoarele astea cand ele habar n-au sa calculeze?
Zau asa! O operatie care pare banala si absolut usor de facut pentru oricine trecut de clasele primare, calculatorul o greseste cu brio si iti pierde o cifra:
System.out.println(20.4*100); // afiseaza 2039.9999999999998
System.out.println((long)(20.4*100)); // afiseaza 2039
Deeeci…. daca vrei sa ai o valoare in double si o inmultesti cu 100 ca s-o treci la o valoare long, e posibil sa nu fie asa de simplu cum ti se pare tie. In zelul lui de a-ti arata cu cate zecimale poate el sa calculeze, computerul uita pe undeva o zecimala, se face ca nu-i asa si iti spune ca de fapt atatea au fost de la inceput, te inseli tu cand ii spui ca a gresit.
Stii care e solutia simpla? Sa-i aduni 0.0000000000001 – Ai idee insa ce se intampla acum? Ei bine, nu! Sigur ca n-ai idee. Doar tu nu gandesti ca un calculator (prima operatie trebuie sa te fi lamurit deja!). Ai crede ca prima valoare afisata ar trebui sa fie 2039.9999999999999 sau daca esti optimist, chiar 2040.00, dar nu… va fi 2040.0000000000001.
Solutia insa functioneaza, conversia la long a valorii rotunjeste cum trebuie, rezultatul e bun, dar inmultirea continua sa fie complet aiurea.
You must love java!!!!
Acel 0.0000000000001 se cheama epsilon. 😀