hoho Posted March 26, 2008 Report Share Posted March 26, 2008 Kaapeec ar Javascript 2.85+0.45 ir 3.3000000000000003 nevis 3.3 ??? Link to comment Share on other sites More sharing options...
andrisp Posted March 26, 2008 Report Share Posted March 26, 2008 Tāpēc, ka tie divi skaitļi ir float tipa. Un float tipa mainīgie šitā uzvedās. Tie nekad nav 100% precīzi. Neprasi kāpēc, nezinu :) Link to comment Share on other sites More sharing options...
hoho Posted March 26, 2008 Author Report Share Posted March 26, 2008 hm.....un ir kaada iespeeja dabuut normaalu rezultaatu 3.3? varbuut kaada funkcija, kas apstrada float tipa mainiigus??? Link to comment Share on other sites More sharing options...
andrisp Posted March 26, 2008 Report Share Posted March 26, 2008 noapaļo. Link to comment Share on other sites More sharing options...
indoom Posted March 26, 2008 Report Share Posted March 26, 2008 JS Math.round() nevar norādīt cik decimāļus aiz komata apaļot. Tāpēc var izmantot šo funkciju // custom function function MathRound(e,d){return Math.round(e*(d=Math.pow(10,d||0)))/d;} //use MathRound(2.85+0.45, 2); // 3.3 MathRound(2.85+0.45); // 3 Link to comment Share on other sites More sharing options...
Grey_Wolf Posted March 26, 2008 Report Share Posted March 26, 2008 float tipa mainīgie šitā uzvedās. Tie nekad nav 100% precīzi. Nevienmer tas ir taa .... Bet Java Script taa tas ir .... , jo JS tomer nav paredzets lielu floot apstradei.... // tiri teoretiski kljuda rodas pasha WIN ..... (kas pats ar ipashu precizitaati neizceljas....) + JS ipatnibu delj.... ------------- Citas programmesanas valodas shaads gljuks nav izteikts.... Link to comment Share on other sites More sharing options...
bubu Posted March 26, 2008 Report Share Posted March 26, 2008 Grey_Wolf: tas ir vienmēr tā. Un JS tur ir ņipričom. Arī C un C++ gan floati, gan doubļi uzvedās tāpat . Vienīgā atšķirība ir tāda, ka, piemēram, tajā pašā C/C++ floatu konvertēšana uz stringu pēc noklusējuma apaļojas ar 6 (ja nemaldos) zīmīgajiem cipariem. Respektīvi 3.30000000000003 = 3.30000 = 3.3 Bet ja paprasīsi izvadīt 20 zīmīgus ciparus, arī dabūsi daudz nuļļu (vai devītnieku) un galā kautkādus ciparus - jebkurā valodā un OS. Un Windows tur galīgi nav vainīgs (gan teorētiski, gan praktiski). Viss ir IEEE 754 standartā pateikts. Pat skaitli 0.1 jebkurā valodā nevarēs precīzi saglabāt pēc IEEE standarta (un atkal - WIN tur ir ņipričom). Paņemsi linuxi - arī 0.1 nevarēsi precīzi saglabāt. Reku ļoti valīds standarta C++ kods: #include <iostream> #include <iomanip> int main() { float a = 2.85f; float b = 0.45f; float c = a + b; std::cout << c << std::endl; std::cout << std::setprecision(50) << c << std::endl; } To palaižot iegūsi šādu outputu: 3.3 3.2999999523162841796875 Nav gluži tas pats, kas JS (jo visdrīzāk atšķirās underflow/overflow situāciju handlošanas režīma uzstādījums), taču nezkāpēc tavuprāt otrā rinda neizvada 3.3? Tiem, kuri grib saprast kāpēc tā notiek - lūdzu lasīt šo: http://docs.sun.com/source/806-3568/ncg_goldberg.html Īsi paskaidrojot kāpēc - tas notiek tāpēc, ka dators skaiļus neglabā atmiņā decimāli. Tas tos glabā bināri. Respektīvi skaitlis 12 glabājās atmiņā kā 1100. Skaitlis 0.5 kā 0.1. Skaitlis 0.75 kā 0.11. Bet ja tu paņemsi, piemēram, skaitli 0.1, to nevarēs precīzi izteikt ar 1/(2^n) skaitļu summām, ja n (bitu skaits) ir ierobežots (floatam tas ir līdz 23). Un vēl par andrisp teikto - "Tie nekad nav 100% precīzi." Tas gan nav tiesa :) Float tipa skaitļi ir precīzi, tad ja to nozīmīgo bitu skaits salien 23 bitos (floatam) vai 52 bitos (doublim), un vēl eksponente ielien attiecīgi 8 vai 11 bitos. Piemēram, skaitlis 0.0 vienmēr ir precīzs. Tāpat kā skaitļi 1234, 58878822, 111111, 0.25, 0.4375, 3.5, utml. Link to comment Share on other sites More sharing options...
v3rb0 Posted March 26, 2008 Report Share Posted March 26, 2008 tā kā divi cipari aiz komata, tad minu ka tie ir rēķini par naudiņām, ja tā, tad visus rēķinus dari santīmos un tikai pie parādīšanas pārvērt santīmus par latiem ar komatu. Link to comment Share on other sites More sharing options...
Recommended Posts