Jump to content
php.lv forumi

Recommended Posts

Posted

hm.....un ir kaada iespeeja dabuut normaalu rezultaatu 3.3? varbuut kaada funkcija, kas apstrada float tipa mainiigus???

Posted

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

Posted
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....

Posted

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.

Posted

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.

×
×
  • Create New...