Jump to content
php.lv forumi

skaitļi aiz komata


localhero

Recommended Posts

"Atļauts" ir ļoti jocīga prasība. Atļauts ir tik, cik var saglabāt. Un ja tu domā float-point tipa skaitļus, tad tas nav fiksēts lielums.

Piemēram, ja skaitlis ir ~1000000000.0, tad visi cipari aiz komata ir neprecīzi. Jo float (32-bit) tipam zīmīgi ir ~7 cipari. (zīmīgi cipari nav tas pats, kas cipari aiz komata!)

Turpretī, ja skaitlis ir ~0.00001, tad aiz komata ir iespējams precīzi saglabāt ~12 ciparus (5+7).

Vispārīgi sakot - peldošā punkta skaitļiem visvairāk skaitļu ir 0..1 intervālā. Ārpus tā - jo skaitlis ir lielāks pēc absolūtās vērtības, jo neprecīzāks tas būs. Ne tikai cipari aiz komata sāks kļūt neprecīzi, bet gan arī cipari pirms komata sāks arī palikt neprecīzi. 1000000001.0f datoram ir vienāds ar 1000000000.0f.

 

double tipa skaitļiem (64-bit floats) zīmīgo ciparu skaits ir aptuveni 16.

 

Te ir daudz un dikti par peldošā punkta skaitļiem izstāstīts: http://docs.sun.com/source/806-3568/ncg_goldberg.html

 

P.S. nejaukt skaitļus ar cipariem. Aiz komata ir cipari, nevis skaitļi.

Link to comment
Share on other sites

MySQL'ā? NUMERIC(N,2), kur N ir cik zīmīgos ciparus nepieciešams glabāt.

PHP? Tad tur nav iespējams uzlikt, lai skaitlis neglabā vairāk par diviem cipariem aiz komata (ja vien nelietosi fixed-point formātu).

Bet PHP var noapaļot skaitli, konvertējot to uz stringu, piemēram, ar number_format fju.

Link to comment
Share on other sites

Nu - nav jau obligāti jākonvertē uz stringu. Var lietot round().

Var, protams. Bet tad obligāti ir jāatcerās floating point skaitļu uzglabāšanas specifiku. Jo izdarot $a = round($a*100.0)/100.0, var gadīties, ka pēc tam outputā dabūs 1.14999999999 vai arī 1.15000000001.

 

Un vai tad $a = number_format($a, ".", ""); ir tik ļoti sarežģītāk?

Vēl jau ir arī variants $a = sprintf("%.2f", $a);

Link to comment
Share on other sites

Tavs jautājums ir bezjēdzīgs. Jautājumus stilā "Vai ar XX kodu var dabūt YY?" ir nevis jājautā, bet ir jāpamēģina XX kods un jāpaskatās vai sanāk YY.

 

Ak jā, un ja kāds netic, ka ar round ir sliktāk, nekā ar number_format, tad lūdzu reku piemērs. Lai gan tas ir mākslīgs, jo operē ar skaitļiem uz doubļu precizitātes robežas:

$sk = 100000000000000.0 + 0.09;
echo round($sk, 2), "\n";				  // izvada 1.0E+14
echo number_format($sk, 2, ".", ""), "\n"; // izvada 100000000000000.09
echo sprintf("%.2f", $sk);				 // izvada 100000000000000.09

Link to comment
Share on other sites

×
×
  • Create New...