» »

[java] double prištevanje 0.1

[java] double prištevanje 0.1

gtu ::

faking šit. joooj znoru bom!!

imam interval [-5,5]
korak je 0.1

ko poskušam s for zanko zapisati v tabelo vrednosti { -5.0,-4.9,-4.8,...}

mi začne metak kr ene bedne vun:

-0.10000000000000103
-1.0269562977782698E-15
0.09999999999999898
0.19999999999999898
0.299999999999999


koda:

double p=-5.0;
              
        for(int v=0;v<110;v++){
            interval[v]=p;
            p+=0.1;

Sergio ::

Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

gtu ::

si lahko morda bolj natančen?

Fizikalko ::

Nikoli za take operacije ne uporabljal double, ampak BigDecimal.

Tisti link pa si le oglej ter se tako nauči osnov napak števil s plavajočo vejico.

gtu ::

pa sej jst rabm sam na 1 decimalko natančno

Fizikalko ::

Double nenatančno zapiše sdoločen aštevila in se ti to potem vleče naprej. Bodisi uporabljaj BigDecimal ali pa zaokroži , preden delaš operacije ali primerjave.

netanyahu ::

Dobro preberi Wikipedijo in nato še Goldberg, What every computer scientist should know about floating-point arithmetic. Desetiškega števila 1/10 se ne da eksaktno zapisati v binarnem sistemu -- ima neskončno decimalk.

gtu ::

aha
sam še vseeno bi prosil, če se komu da spisat tole čist na kratko?
ker se mi mal mudi

Zgodovina sprememb…

  • spremenil: gtu ()

moowy123 ::

Evo, to dela tako kot ti hočeš.

public static void main(String[] args) {
	
		double start_value = -5.0;
		double step = 0.1;
		
		
		do {
			
			System.out.println(round(start_value,1));
			start_value = start_value + step;
			
		} while (start_value <= 5.0);
	
	}
	
	  public static double round(double value, int decimalPlace)
	  {
	    double power_of_ten = 1;
	    while (decimalPlace-- > 0)
	       power_of_ten *= 10.0;
		return Math.round(value * power_of_ten) / power_of_ten;
	  }

netanyahu ::

Še bolje:
public class Loop {
    public static void main(String[] args) {
        double begin = -5.0, end = 5.0, step = 0.1;

        for(int i=0; i <= (int)((end-begin)/step); i++) {
            double a = begin + i*step;
            System.out.printf("%.4f\n", a);
        }
    }
}


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Fix skripte: nginx log + group by user-agent + count + sort desc

Oddelek: Programiranje
5724 (647) Invictus
»

[ubunto] 8.10 in poraba procesorja

Oddelek: Operacijski sistemi
211432 (1200) Jernej88_
»

[c#] enostavna Igrca -> poraba procesorja 95%

Oddelek: Programiranje
192165 (1529) elKaktus
»

[Java] Deljenje in ostanek

Oddelek: Programiranje
143110 (2694) pr2501
»

Slovenci imamo radi Firefox (strani: 1 2 )

Oddelek: Novice / Brskalniki
8322550 (15563) veteran

Več podobnih tem