Jump to content
php.lv forumi

Javascript un divu skaitļu saskaitīšana


hoho

Recommended Posts

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

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

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

×
×
  • Create New...