/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
0.9 + 0.1 = 0.9999999999999999 ?
Fra : scootergrisen


Dato : 04-09-11 19:18

I Javascript ønsker jeg at øge/mindske værdien af noget med 0.1

Det giver så bare ikke det resultat jeg vil have.

0.9 + 0.1 = 0.9999999999999999

Jeg kan læse mig til det er fordi værdien er et double og computeren
gemmer data som binær og derfor ikke kan gemme kommatal som 0,1
præcist i computeren.

Men hvordan får jeg det til at virke sådan her...

0,9 + 0.1 = 1.0
0.9 - 0.1 = 0.8

 
 
Kim Ludvigsen (05-09-2011)
Kommentar
Fra : Kim Ludvigsen


Dato : 05-09-11 04:57

Den 05-09-2011 03:18, scootergrisen skrev:
> I Javascript ønsker jeg at øge/mindske værdien af noget med 0.1
> Det giver så bare ikke det resultat jeg vil have.
> 0.9 + 0.1 = 0.9999999999999999

Gang og del med 10.

> Men hvordan får jeg det til at virke sådan her...
>
> 0,9 + 0.1 = 1.0
> 0.9 - 0.1 = 0.8

0,9*10 + 0.1*10 = 10/10
0,9*10 - 0.1*10 = 8/10

--
Mvh. Kim Ludvigsen
Tips til hjemmesidesnedkeren:
http://kimludvigsen.dk/tips-internet-websnedker.php


Birger Sørensen (05-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 05-09-11 07:45

scootergrisen skrev den 9/5/2011:
> I Javascript ønsker jeg at øge/mindske værdien af noget med 0.1
>
> Det giver så bare ikke det resultat jeg vil have.
>
> 0.9 + 0.1 = 0.9999999999999999
>
> Jeg kan læse mig til det er fordi værdien er et double og computeren
> gemmer data som binær og derfor ikke kan gemme kommatal som 0,1
> præcist i computeren.
>
> Men hvordan får jeg det til at virke sådan her...
>
> 0,9 + 0.1 = 1.0
> 0.9 - 0.1 = 0.8

(0.9+0.1).toPrecision(1);
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/toPrecision
eller
(0.9+0.1).toFixed(1);
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/toFixed

Bemærk, at begge returnerer en streng.
Skal du arbejde videre med resultatet, skal du bruge parseFloat for at
lave det til et tal igen.
Eller lægge det til eller trække det fra et andet tal (f.eks. 0) først.
Eller gange det med 1, det plejer vist også at virke...

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Andreas Andersen (05-09-2011)
Kommentar
Fra : Andreas Andersen


Dato : 05-09-11 16:19

On 05-09-2011 08:44, Birger Sørensen wrote:
> (0.9+0.1).toPrecision(1);
> https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/toPrecision
>
> eller
> (0.9+0.1).toFixed(1);
> https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/toFixed
>
>
> Bemærk, at begge returnerer en streng.
> Skal du arbejde videre med resultatet, skal du bruge parseFloat for at
> lave det til et tal igen.

Eller lade være at smide resultatet væk.

--
Andreas

Lasse Reichstein Nie~ (26-09-2011)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 26-09-11 16:15

"Dennis Munding" <nogen@etdomæne.dk> writes:

> Uden at være ekspert på området, så kan jeg (ud fra det, jeg lærer
> p.t.), at der er noget, der hedder floor i javascript.
>
> Eks.:
>
> minvar=Math.floor(Math.random()*20+1); /* Giver et tilfældigt heltal
> mellem 1 og 20 */
>
> Men grundet min lærers manglende opdatering, er jeg ikke sikker på, at
> det er korrekt.

Det er korrekt.
Tjek: http://es5.github.com/#x15.8.2.9

> Det virker dog i de 4 browsere jeg har testet i (Opera, FF, IE og
> Chrome - alle med nyeste version).

Det har virket i alle browsere siden ... lang tid siden.

/L
--
Lasse Reichstein Holst Nielsen
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

scootergrisen (05-09-2011)
Kommentar
Fra : scootergrisen


Dato : 05-09-11 08:01

On 5 Sep., 08:44, Birger Sørensen <s...@bbsorensen.com> wrote:
> scootergrisen skrev den 9/5/2011:
>
> > I Javascript nsker jeg at ge/mindske v rdien af noget med 0.1
>
> > Det giver s bare ikke det resultat jeg vil have.
>
> > 0.9 + 0.1 = 0.9999999999999999
>
> > Jeg kan l se mig til det er fordi v rdien er et double og computeren
> > gemmer data som bin r og derfor ikke kan gemme kommatal som 0,1
> > pr cist i computeren.
>
> > Men hvordan f r jeg det til at virke s dan her...
>
> > 0,9 + 0.1 = 1.0
> > 0.9 - 0.1 = 0.8
>
> (0.9+0.1).toPrecision(1);https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
> eller
> (0.9+0.1).toFixed(1);https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
>
> Bem rk, at begge returnerer en streng.
> Skal du arbejde videre med resultatet, skal du bruge parseFloat for at
> lave det til et tal igen.
> Eller l gge det til eller tr kke det fra et andet tal (f.eks. 0) f rst.
> Eller gange det med 1, det plejer vist ogs at virke...
>
> Birger
>
> --http://varmeretter.dk- billig, sund og hurtig madhttp://bbsorensen.dk

Jeg er ved at blive idiot over det her.

Nu ville jeg lave et eksempel til jer men det kan jeg ikke engang
finde ud af.

Lad os sige jeg vil øge/mindske værdien i <input> feltet med 0.1 ved
at trykke på nogle knapper...
Hvordan gør man det ?

<input id="tal" type="text" value="0.4">

<button onclick="document.getElementById('tal').value += 0.1">
Op
</button>

<button onclick="document.getElementById('tal').value -= 0.1">
Ned
</button>

Birger Sørensen (05-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 05-09-11 16:33

Efter mange tanker skrev scootergrisen:
> On 5 Sep., 08:44, Birger Sørensen <s...@bbsorensen.com> wrote:
>> scootergrisen skrev den 9/5/2011:
>>
>>> I Javascript nsker jeg at ge/mindske v rdien af noget med 0.1
>>> Det giver s bare ikke det resultat jeg vil have.
>>> 0.9 + 0.1 = 0.9999999999999999
>>
>>> Jeg kan l se mig til det er fordi v rdien er et double og computeren
>>> gemmer data som bin r og derfor ikke kan gemme kommatal som 0,1
>>> pr cist i computeren.
>>
>>> Men hvordan f r jeg det til at virke s dan her...
>>> 0,9 + 0.1 = 1.0
>>> 0.9 - 0.1 = 0.8
>>
>> (0.9+0.1).toPrecision(1);https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
>> eller
>> (0.9+0.1).toFixed(1);https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
>>
>> Bem rk, at begge returnerer en streng.
>> Skal du arbejde videre med resultatet, skal du bruge parseFloat for at
>> lave det til et tal igen.
>> Eller l gge det til eller tr kke det fra et andet tal (f.eks. 0) f rst.
>> Eller gange det med 1, det plejer vist ogs at virke...
>>
>> Birger
>>
>> --http://varmeretter.dk- billig, sund og hurtig madhttp://bbsorensen.dk
>
> Jeg er ved at blive idiot over det her.
>
> Nu ville jeg lave et eksempel til jer men det kan jeg ikke engang
> finde ud af.
>
> Lad os sige jeg vil øge/mindske værdien i <input> feltet med 0.1 ved
> at trykke på nogle knapper...
> Hvordan gør man det ?
>
> <input id="tal" type="text" value="0.4">
>
> <button onclick="document.getElementById('tal').value += 0.1">
> Op
> </button>
>
> <button onclick="document.getElementById('tal').value -= 0.1">
> Ned
> </button>

<button onclick="Adjust(0.1);">Op</button>
<button onclick="Adjust(-0.1);">Ned</button>

function Adjust(delta) {
var elm = document.getElementById('tal');
if (elm) {
elm.value = (elm.value+delta).toFixed(1);
}
}

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



scootergrisen (05-09-2011)
Kommentar
Fra : scootergrisen


Dato : 05-09-11 11:16

Når man skriver "elm.value + delta" så lægges tallene ikke sammen som
man skulle tro.
Istedet sættes de 2 strenge sammen... og det er jo ikke meningen.

Hvordan gør man så de lægges sammen som tal ?

scootergrisen (05-09-2011)
Kommentar
Fra : scootergrisen


Dato : 05-09-11 11:31

Ok prøv og kig her og tryk op og ned : http://scootergrisen.dk/test/test0084.html

0.9999999999999999 skulle gerne være 1.0 så der kan jeg ikke bruge
toFixed(1) fordi så bliver det bare 0.9

Hvis man er ved 0.10000000000000003 (som skulle være 0.1) og trykker
ned så fucker den helt op.
Istedet for at skrive 0.0 står der 2.7755575615628914e-17


Andreas Andersen (05-09-2011)
Kommentar
Fra : Andreas Andersen


Dato : 05-09-11 19:21

On 05-09-2011 19:31, scootergrisen wrote:
> Ok prøv og kig her og tryk op og ned : http://scootergrisen.dk/test/test0084.html
>
> 0.9999999999999999 skulle gerne være 1.0 så der kan jeg ikke bruge
> toFixed(1) fordi så bliver det bare 0.9
>
> Hvis man er ved 0.10000000000000003 (som skulle være 0.1) og trykker
> ned så fucker den helt op.
> Istedet for at skrive 0.0 står der 2.7755575615628914e-17
>

På min computer virker dit script fint, hvis jeg tilføjer toFixed(1) -
både i FF og IE.

--
Andreas

Birger Sørensen (05-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 05-09-11 22:01

Andreas Andersen kom med denne ide:
>
> På min computer virker dit script fint, hvis jeg tilføjer toFixed(1) - både i
> FF og IE.

I FF også her...

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Stig Johansen (06-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 06-09-11 10:35

scootergrisen wrote:

> 0.9999999999999999 skulle gerne være 1.0 så der kan jeg ikke bruge
> toFixed(1) fordi så bliver det bare 0.9
>
> Hvis man er ved 0.10000000000000003 (som skulle være 0.1) og trykker
> ned så fucker den helt op.
> Istedet for at skrive 0.0 står der 2.7755575615628914e-17

Velkommen til 'det virkelige liv', hvor du nu selv har prøvet hvorfor man
ALDRIG bruger floating point variable til forretningssystemer.

Det er ikke 'fucking up', men en egenskab ved floating points.

Der er jo nok en årsag til COBOL stadig styrer inden for 'tung EDB', da man
ikke har disse problemer.

--
Med venlig hilsen
Stig Johansen

scootergrisen (05-09-2011)
Kommentar
Fra : scootergrisen


Dato : 05-09-11 15:09

Jeg kan godt skrive :

<button onclick="document.getElementById('afspiller').volume += 0.1;

Men kan man ikke skrive noget i stil med dette ? :

<button onclick="document.getElementById('afspiller').volume +=
(0.1).toFixed(1);

Eller hvordan gør jeg det ?

Birger Sørensen (05-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 05-09-11 23:45

scootergrisen har bragt dette til os:
> Jeg kan godt skrive :
>
> <button onclick="document.getElementById('afspiller').volume += 0.1;
>
> Men kan man ikke skrive noget i stil med dette ? :
>
> <button onclick="document.getElementById('afspiller').volume +=
> (0.1).toFixed(1);
>
> Eller hvordan gør jeg det ?

Fordi du *vil* have scriping rodet ind i indhold?

Men nej, det kan du ikke. toFixed er en egenskab for resultatet, ikke
mellemregningen.

document.getElementById('afspiller').volume =
(document.getElementById('afspiller').volume + 0.1).toFixed(1)
og formentlig skal du også have parse float ind over, fordi
egenskaberne for elementer almindeligvis er strenge - ikke tal (volume
er en streng, ikke et tal). Det akn godt være det er anderledes i HTML5
- tror det nu ikke.
Kan man ikke angive volumen i % i stedet for?
Det er jo det du vil - justere volumen 10% op eller ned.
(Og hvis det skal være helt rigtigt, skal det være efter en logaritmisk
skala - men det bliver nok for kompliceret )

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



scootergrisen (05-09-2011)
Kommentar
Fra : scootergrisen


Dato : 05-09-11 17:16

> document.getElementById('afspiller').volume =
> (document.getElementById('afspiller').volume + 0.1).toFixed(1)

Det virker sku. Tak for det.

> Kan man ikke angive volumen i % i stedet for?

Det tror jeg ikke. Det skal vist være en værdi mellem 0.0 og 1.0

Jeg er lidt skuffet over hvor besværligt det kan være at gøre ting i
javascript når det er så let i for eksempel PHP.

Jeg har læst noget om :

use decimal;

og

var a = 0.1m;

Men det kan jeg ikke få til at virke.
Koden ville være mere overskuelig hvis man bare kunne skrive :

document.getElementById('afspiller').volume += 0.1m;

eller...

use decimal;
document.getElementById('afspiller').volume += 0.1;

Birger Sørensen (06-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 06-09-11 07:38

scootergrisen formulerede spørgsmålet:
>> document.getElementById('afspiller').volume =
>> (document.getElementById('afspiller').volume + 0.1).toFixed(1)
>
> Det virker sku. Tak for det.

Yw

> use decimal;
> document.getElementById('afspiller').volume += 0.1;

Det kan du vel også. Det ser bare ikke så pænt ud.

Hvis du nu bare lader din linie skrive et tal mellem 0 og 100.
Og det behøver ikke være input - det kan være en span, for den sags
skyld.
Knapperne lægger 10 til eller trækker 10 fra.
Så har du visningen i %, og skal bare dividere tallet med 100, når det
faktisk sætter volumen.

Volumen: <span id="volume">40</span>%
<button onclick="Juster('op');">Op</button>
<button onclick="Juster('ned');">Ned</button>

function Juster(dir) {
var vol_elm = document.getElementById('volume');
var vol = parseInt(vol_elm.value);
vol += (dir == 'op') ? 10 : -10;
if (vol > 100) { vol = 100; }
if (vol < 0) { vol = 0; }
vol_elm.value = vol;
document.getElementById('afspiller').volume = (vol/100).toFixed(1);
}

js bruger + til både at lægge tal sammen, og sætte strenge sammen.
Det betyder rent praktisk, at man som programmør, er nødt til at sørge
for at være sikker på at man bruger den rigtige type variabel til
formålet.
'1' + '1' = '11'
1 + 1 = 2
'1' + 1 = ? - afhænger af mange ting, men vil oftest give '11'
1 + '1' = ? - er heller ikke veldefineret, men vil oftes give 2
Derfor er det en god ide i js, når der kan være tvivl om variabeltypen,
at starte med at lægge 0 til
0 + '1' = 1
Men i vrikeligheden er det bedre, at bruge * eller / for de virker ikke
strenge
('1'*1) + '1' bør give resultat 2.

I PHP lægger + tal sammen, og strenge sættes sammen med .
(concatenering).
Programmøren vælger altså om der skal arbejdes med tal eller strenge,
og "problemet" eksisterer ikke længere - PHP ved om der skal arbejdes
med tal eller strenge, og konverterer som nødvendigt.
'1' + '1' = 2
1 + 1 = 2
'1' . '1' = '11'
1 . 1 = '11'
1 + '1' = 2
1 . '1' = '11'

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



scootergrisen (06-09-2011)
Kommentar
Fra : scootergrisen


Dato : 06-09-11 04:06

> Det er ikke 'fucking up', men en egenskab ved floating points.

Ja det virker altså helt mærkeligt at man ikke bare kan sige 1 + 0.1
også det bliver 1.1
Det virker da så fint på en lommeregner og i PHP og alt muligt andet.

Det er fint nok at det har noget at gøre med at computeren gennem data
som binær men altså det gør en lommeregner jo også og hvornår ønsker
man 0.1 med binær upræcision ?

Det virker bare så mærkeligt de har lavet det på den måde.

Men det nok fordi jeg er så dårlig til javascript at jeg ikke fatter
det rigtigt.

Javascript har skuffet mig en del for år tilbage med browsere der
crasher og svært at få koden til at virke som man ønsker også skal
koden være forskellig i forskellige browsere men nu i HTML 5 ser det
ud til at man skal bruge javascript til at lave ting så jeg bliver
åbenbart nød til at bruge det så ville nok være bedre at lære
javascript ordentligt istedet for jeg altid skal have problemer med
ting der er så simple i PHP for eksempel der ville jeg jo ikke gå istå
bare jeg skulle øge en værdi med 0.1 det virker jo helt forkert at det
skulle gå galt.

Andreas Andersen (06-09-2011)
Kommentar
Fra : Andreas Andersen


Dato : 06-09-11 11:23

Den 06-09-2011 12:06, scootergrisen skrev:
>> Det er ikke 'fucking up', men en egenskab ved floating points.
>
> Ja det virker altså helt mærkeligt at man ikke bare kan sige 1 + 0.1
> også det bliver 1.1
> Det virker da så fint på en lommeregner og i PHP og alt muligt andet.
>
> Det er fint nok at det har noget at gøre med at computeren gennem data
> som binær men altså det gør en lommeregner jo også og hvornår ønsker
> man 0.1 med binær upræcision ?
>
> Det virker bare så mærkeligt de har lavet det på den måde.

Det er ikke mærkeligt, det er bare nogle andre tal, man kan repræsentere
præcist. F.eks. er 0.1 i binær lig med 0.5 i decimal, 0.01 er 0.25, 0.11
er 0.75 osv. Lommeregneren er også binær, så de må også bruge nogle
fiksfakserier for at arbejde uden om det, når de skal vise resultater.
Such is life.

Matematik er også sjovt - det er f.eks. ret let at bevise, at 0.(9)
(uendelig 9'ere) = 1

--
Andreas

Stig Johansen (07-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 07-09-11 08:38

scootergrisen wrote:

> Men det nok fordi jeg er så dårlig til javascript at jeg ikke fatter
> det rigtigt.

Nej, det har ikke noget med dig at gøre.

Alle moderne CPU'ere har 2 basale typer, og i forskellig størrelse.
Floating point:
32-bit og 64-bit.
Integers (heltal)
16,32,64,128 og muligvis 256-bit.

Det bliver nok for teknisk, men i finansielle applikationer benytter man
'implied decimal' - eller populært sagt "Heltal med fast antal decimaler".

Problemet med floating points er, at man ikke _præcist_ kan angive 10^x, og
dermed (af og til) får afrundingsfejl.

--
Med venlig hilsen
Stig Johansen

scootergrisen (07-09-2011)
Kommentar
Fra : scootergrisen


Dato : 07-09-11 08:49

> Det bliver nok for teknisk, men i finansielle applikationer benytter man
> 'implied decimal' - eller populært sagt "Heltal med fast antal decimaler".
>
> Problemet med floating points er, at man ikke _præcist_ kan angive 10^x, og
> dermed (af og til) får afrundingsfejl.

Men det oplever jeg da slet ikke som et problem i PHP.


Stig Johansen (07-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 07-09-11 09:03

scootergrisen wrote:

> Men det oplever jeg da slet ikke som et problem i PHP.

Du kan ikke sammenligne på tværs af sprog/fortolkere/compilere.

I COBOL har jeg ikke problemet (implied decimal).

I Delphi har jeg ikke problemet (bruger currency = int64 med implied
decimal).

I Delphi er der udviklet rutiner til at korrigere for afrundingsfejl og NaN,
men det er satemene langhåret assembler, som man ikke har adgang til i
disse primitive sprog.

--
Med venlig hilsen
Stig Johansen

scootergrisen (07-09-2011)
Kommentar
Fra : scootergrisen


Dato : 07-09-11 09:26

Den 07-09-2011 10:02, Stig Johansen skrev:
> scootergrisen wrote:
>
>> Men det oplever jeg da slet ikke som et problem i PHP.
>
> Du kan ikke sammenligne på tværs af sprog/fortolkere/compilere.
>
> I COBOL har jeg ikke problemet (implied decimal).
>
> I Delphi har jeg ikke problemet (bruger currency = int64 med implied
> decimal).
>
> I Delphi er der udviklet rutiner til at korrigere for afrundingsfejl og NaN,
> men det er satemene langhåret assembler, som man ikke har adgang til i
> disse primitive sprog.
>

Jeg ville bare gerne have at jeg kunne skriver denne kode øverst også
virkede det som jeg har læst :

use decimal;

Men ved ikke hvorfor det ikke virker.

Stig Johansen (07-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 07-09-11 10:04

scootergrisen wrote:

> Jeg ville bare gerne have at jeg kunne skriver denne kode øverst også
> virkede det som jeg har læst :
>
> use decimal;

Mon ikke det er forslag til ny Ecma standard?

> Men ved ikke hvorfor det ikke virker.

På samme måde som HTML-standarder, vil browsere ikke 'automagisk' begynde at
virke.

Du kan måske finde en workaround her:
http://www.mediacollege.com/internet/javascript/number/round.html


--
Med venlig hilsen
Stig Johansen

scootergrisen (07-09-2011)
Kommentar
Fra : scootergrisen


Dato : 07-09-11 10:31

Den 07-09-2011 11:04, Stig Johansen skrev:
> scootergrisen wrote:
>
>> Jeg ville bare gerne have at jeg kunne skriver denne kode øverst også
>> virkede det som jeg har læst :
>>
>> use decimal;
>
> Mon ikke det er forslag til ny Ecma standard?
>
>> Men ved ikke hvorfor det ikke virker.
>
> På samme måde som HTML-standarder, vil browsere ikke 'automagisk' begynde at
> virke.
>
> Du kan måske finde en workaround her:
> http://www.mediacollege.com/internet/javascript/number/round.html
>
>

Jeg syns jeg jeg læste at "use decimal;" skulle virker i ecmascript4
også søgte jeg også stod der at firefox understøtter ecmascript5.
Og jeg prøvede også med
<script type="text/ecmascript">

Stig Johansen (07-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 07-09-11 10:46

scootergrisen wrote:

> Jeg syns jeg jeg læste at "use decimal;" skulle virker i ecmascript4
> også søgte jeg også stod der at firefox understøtter ecmascript5.
> Og jeg prøvede også med
> <script type="text/ecmascript">

Jeg ved ikke hvor du har læst det skulle være standard.
Jeg bruger ikke selv Javascript til databehandling[1], så jeg ved ikke om
det er implementeret.

Er det vedtaget som standard, eller er det en proposal?
https://mail.mozilla.org/pipermail/es-discuss/2008-February/005447.html

NB: Jeg ved ikke hvad de mener med 'decimal', da ting hedder forskelligt i
forskellige sprog.


Men HP3000/COBOL havde også BCD (Binary Coded Decimal) både i sprog og CPU -
mon det er det de mener med 'decimal'.

[1] ALTID serverside!
--
Med venlig hilsen
Stig Johansen

scootergrisen (07-09-2011)
Kommentar
Fra : scootergrisen


Dato : 07-09-11 10:56

> Jeg ved ikke hvor du har læst det skulle være standard.
> Jeg bruger ikke selv Javascript til databehandling[1], så jeg ved ikke om
> det er implementeret.
>
> Er det vedtaget som standard, eller er det en proposal?
> https://mail.mozilla.org/pipermail/es-discuss/2008-February/005447.html
>
> NB: Jeg ved ikke hvad de mener med 'decimal', da ting hedder forskelligt i
> forskellige sprog.

Det står herinde :
http://dev.opera.com/articles/view/why-i-love-ecmascript-4-real-decimals/

{
use decimal;

var a = 0.1; // a is a decimal
var b = 0.2; // b is a decimal
var c = a + b; // c is a decimal (0.3)
}

var d = 0.1 + 0.2; // d is a double (0.30000000000000004)

Jeg tror decimal betyder at kommatal (0.1) gemmes som decimal i computeren.
Modsat normalt hvor det gemmes som binær... som ikke er istand til at
gemmes tal som 0.1 præcist.

Bare noget jeg har læst ved ikke så meget om det.

Stig Johansen (07-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 07-09-11 11:41

scootergrisen wrote:

> Det står herinde :
> http://dev.opera.com/articles/view/why-i-love-ecmascript-4-real-decimals/

Du må selv holde øje med følgende citat:
<quote>to make use of decimal floating points, you'll need a language based
on ECMAScript 4, such as ActionScript 3 (available in Adobe Flash 9 and
Flex 2/3) or JavaScript 2 (supported in future versions of Opera, but not
right at the moment.)
</citat>

> Jeg tror decimal betyder at kommatal (0.1) gemmes som decimal i
> computeren. Modsat normalt hvor det gemmes som binær... som ikke er istand
> til at gemmes tal som 0.1 præcist.
>
> Bare noget jeg har læst ved ikke så meget om det.

Men det gør jeg
Baseret på udtalelserne om performance tyder det på de gemmes som BCD, som
er kendetegnet ved høj præcision, men langsom hastighed.

Det ville være en bedre løsning at bruge integers med implied decimal, hvor
integer delen er indbygget i enhver CPU.

NB: Implied decimal har intet med typen 'decimal' at gøre, men angiver et
fast antal decimaler.

--
Med venlig hilsen
Stig Johansen

scootergrisen (07-09-2011)
Kommentar
Fra : scootergrisen


Dato : 07-09-11 11:51

> NB: Implied decimal har intet med typen 'decimal' at gøre, men angiver et
> fast antal decimaler.

Og hvordan gør jeg så det ?

Hvis jeg vil sige :

a = 0.1;


scootergrisen (07-09-2011)
Kommentar
Fra : scootergrisen


Dato : 07-09-11 11:52

Den 07-09-2011 12:40, Stig Johansen skrev:
> Det ville være en bedre løsning at bruge integers med implied decimal, hvor
> integer delen er indbygget i enhver CPU.

Hvordan bruger jeg så implied decimal ?

Hvis jeg vil skrive :

a = 0.1;

Stig Johansen (08-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 08-09-11 08:57

scootergrisen wrote:

> Hvordan bruger jeg så implied decimal ?

Det ved jeg ikke (i Javascript), for det skal være indbygget i _sproget_.

--
Med venlig hilsen
Stig Johansen

Frank Damgaard (07-09-2011)
Kommentar
Fra : Frank Damgaard


Dato : 07-09-11 13:39

On 2011-09-07 11:56, scootergrisen wrote:
......

>
> var d = 0.1 + 0.2; // d is a double (0.30000000000000004)
>
> Jeg tror decimal betyder at kommatal (0.1) gemmes som decimal i computeren.
> Modsat normalt hvor det gemmes som binær... som ikke er istand til at gemmes tal som 0.1
> præcist.
>
> Bare noget jeg har læst ved ikke så meget om det.

flydende tal:
http://en.wikipedia.org/wiki/Floating_point
standarder:
http://en.wikipedia.org/wiki/IEEE_754


generelt består et flydende tal af en mantissa og en eksponent.
Hvert af disse tildeles et antal bit, f.eks. i "små præcision tal"
med 24 bit mantissa og 8 bit eksponent.
dvs. mantissa * ( G ^ Exp )

Mantissa har ofte, hvis alle bit er sat, en absolut værdi på knap "1"
(dvs. ikke helt "1"), og det repræsenteres binært.
Dette tal ganges så med eksponent der også kan være binært.
(forskellige standarder kan gøre det lidt forskelligt)

Det betyder at ikke alle flydende tal kan repræsenteres præcist,
men er tilnærmet.
Ekspempel opløst i brøker der er i form 1/(2^N) :
0.1 = 1/16+1/32+1/256+1/512+1/4096+1/8192+1/65536+1/131072+1/1048576 + .....
noget tilsvarende for 0.2

Helt galt går det når 2 næsten ens tal subtraheres, og der så arbejdes videre
med dette tal, det kan give meget dårlig præcision eller tal helt hen i vejret....!!

Normalt vil en computer prøve at bruge en talrepræsentation for flydende tal som
tilbydes af floating-point enheden i CPU (ofte nogle fra IEEE-754).


Så når man bruger flydende tal, så skal man være forsigtig med resultaterne.

Et problem er hvis der anvendes sprog hvor man ikke helt ved om det gemmes
som tekst-streng, heltal, eller flydende tal.
Derfor give en del programmeringssprog mulighed for at man specificerer "types"
og præcision på heltal og flydende tal.


PHP og javascript er ikke et af de sprog hvor man kan angive type ;
så her må man ved talberegning normalt antage det er flydende tal.

http://php.net/manual/en/language.types.float.php
http://www.hunlock.com/blogs/The_Complete_Javascript_Number_Reference
http://jibbering.com/faq/notes/type-conversion/



Stig Johansen (08-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 08-09-11 08:56

Frank Damgaard wrote:

> generelt består et flydende tal af en mantissa og en eksponent.
> Hvert af disse tildeles et antal bit, f.eks. i "små præcision tal"
> med 24 bit mantissa og 8 bit eksponent.
> dvs. mantissa * ( G ^ Exp )

Ja, og double består af 53+11 bits.

Men når nu Scooteren nævner HP (som jeg har arbejdet for,med osv), så brugte
de i 'tidernes morgen' 54+10 bits.

Det var årsagen til f.eks. Elkraft købte HP3000 (business) maskiner i stadet
for 'konkulegaernes', da præcisionen dermed var højere ;)


--
Med venlig hilsen
Stig Johansen

Philip Nunnegaard (07-09-2011)
Kommentar
Fra : Philip Nunnegaard


Dato : 07-09-11 23:08

Den 06-09-2011 12:06, scootergrisen skrev:

> Ja det virker altså helt mærkeligt at man ikke bare kan sige 1 + 0.1
> også det bliver 1.1
> Det virker da så fint på en lommeregner og i PHP og alt muligt andet.

Og dog har jeg oplevet problemer i PHP når jeg ville gemme tal i databasen.
Hvis feltet er defineret som "int" og ikke som "decimal", æder den kun
hele tal.
Hvordan klarer jeg så det, når jeg vil regne med decimaler?

Mange gange gør jeg som Kim Ludvigsen foreslog: Gange og derefter dele igen.
Dvs. jeg ganger tallet med fx 1000 og gemmer den værdi i databasen.
Når tallet hentes ud fra databasen igen, deler jeg med 1000.

--
Philip

scootergrisen (07-09-2011)
Kommentar
Fra : scootergrisen


Dato : 07-09-11 23:20

> Og dog har jeg oplevet problemer i PHP når jeg ville gemme tal i databasen.
> Hvis feltet er defineret som "int" og ikke som "decimal", æder den kun
> hele tal.

Er det ikke databasen som er problemet. mySQL eller hvad du bruger.

> Hvordan klarer jeg så det, når jeg vil regne med decimaler?

I PHP behøver man ikke definere en værdi som int. Det finder PHP selv ud
af alt efter hvad man tildeler og hvor værdien skal bruges.

> Mange gange gør jeg som Kim Ludvigsen foreslog: Gange og derefter dele
> igen.
> Dvs. jeg ganger tallet med fx 1000 og gemmer den værdi i databasen.
> Når tallet hentes ud fra databasen igen, deler jeg med 1000.

Ok jeg skal prøve og huske det der er blevet snakket om næste gang jeg
får problemer med de her kommatal.

Stig Johansen (08-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 08-09-11 08:46

Philip Nunnegaard wrote:

> Og dog har jeg oplevet problemer i PHP når jeg ville gemme tal i
> databasen. Hvis feltet er defineret som "int" og ikke som "decimal", æder
> den kun hele tal.

Int (Integer) betyder hele tal, og kan ikke gemme decimaler.

Prøv at kigge under data types i denne her:
http://dev.mysql.com/doc/refman/5.5/en/create-table.html


--
Med venlig hilsen
Stig Johansen

Lasse Reichstein Nie~ (06-09-2011)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 06-09-11 17:06

scootergrisen <scootergrisen@gmail.com> writes:

> I Javascript ønsker jeg at øge/mindske værdien af noget med 0.1
>
> Det giver så bare ikke det resultat jeg vil have.
>
> 0.9 + 0.1 = 0.9999999999999999
>
> Jeg kan læse mig til det er fordi værdien er et double og computeren
> gemmer data som binær og derfor ikke kan gemme kommatal som 0,1
> præcist i computeren.
>
> Men hvordan får jeg det til at virke sådan her...
>
> 0,9 + 0.1 = 1.0
> 0.9 - 0.1 = 0.8

Det aller-sikreste er ikke at bruge decimal-tal i beregningerne. Hvis du
altid kun regner med tiendedele, så gem 10*værdien i din variabel, og
lav den kun om til decimaler når den skal bruges til noget.

E.g.

<script>
var vol = 10;
function adjustVol(by) {
vol += by;
document.getElementById("output").value = (vol/10).toFixed(1);
// gør noget mere med værdien
}
</script>
<input type="button" value="-" onclick="adjustVol(-1)">
<input type="text" id="output" value="1.0">
<input type="button" value="+" onclick="adjustVol(1)">

Alternativet, til nyere browsere, kan du bruge et felt der indeholder
tal og kan tælle op og ned:
<input type="number" min="0" max="10" step="0.1" value="1"
onchange="// gør noget med this.value">

/L
--
Lasse Reichstein Holst Nielsen
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

scootergrisen (06-09-2011)
Kommentar
Fra : scootergrisen


Dato : 06-09-11 17:59

Den 06-09-2011 18:06, Lasse Reichstein Nielsen skrev:
> scootergrisen<scootergrisen@gmail.com> writes:
>
>> I Javascript ønsker jeg at øge/mindske værdien af noget med 0.1
>>
>> Det giver så bare ikke det resultat jeg vil have.
>>
>> 0.9 + 0.1 = 0.9999999999999999
>>
>> Jeg kan læse mig til det er fordi værdien er et double og computeren
>> gemmer data som binær og derfor ikke kan gemme kommatal som 0,1
>> præcist i computeren.
>>
>> Men hvordan får jeg det til at virke sådan her...
>>
>> 0,9 + 0.1 = 1.0
>> 0.9 - 0.1 = 0.8
>
> Det aller-sikreste er ikke at bruge decimal-tal i beregningerne. Hvis du
> altid kun regner med tiendedele, så gem 10*værdien i din variabel, og
> lav den kun om til decimaler når den skal bruges til noget.
>
> E.g.
>
> <script>
> var vol = 10;
> function adjustVol(by) {
> vol += by;
> document.getElementById("output").value = (vol/10).toFixed(1);
> // gør noget mere med værdien
> }
> </script>
> <input type="button" value="-" onclick="adjustVol(-1)">
> <input type="text" id="output" value="1.0">
> <input type="button" value="+" onclick="adjustVol(1)">
>
> Alternativet, til nyere browsere, kan du bruge et felt der indeholder
> tal og kan tælle op og ned:
> <input type="number" min="0" max="10" step="0.1" value="1"
> onchange="// gør noget med this.value">
>
> /L

Ok tak. Det virker ok som det er nu men kan være jeg kan bruge din kode
senere når jeg skal lave mere med det.

Rune Jensen (12-09-2011)
Kommentar
Fra : Rune Jensen


Dato : 12-09-11 09:04

On 7 Sep., 15:07, Philip Nunnegaard <nunnenos...@hitsurf.dk> wrote:
> Den 06-09-2011 12:06, scootergrisen skrev:
>
> > Ja det virker altså helt mærkeligt at man ikke bare kan sige 1 + 0.1
> > også det bliver 1.1
> > Det virker da så fint på en lommeregner og i PHP og alt muligt andet.
>
> Og dog har jeg oplevet problemer i PHP når jeg ville gemme tal i databasen.
> Hvis feltet er defineret som "int" og ikke som "decimal", æder den kun
> hele tal.

int = integer = heltal.

Heltal er så ikke bare hetal. Man kan vælge at få alt før kommaet (som
jeg mener, at int er), eller en egentlig afrunding. I ASP er der
vidstnok to yderligere muligheder for enten at runde op eller ned til
nærmeste helkal. Kan så ikke lige huske dem, men jeg har brugt dem
engang i en demo af "terningekast".


MVH
Rune Jensen

Birger Sørensen (12-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 12-09-11 17:34

Efter mange tanker skrev Rune Jensen:
8X
> Heltal er så ikke bare hetal. Man kan vælge at få alt før kommaet (som
> jeg mener, at int er), eller en egentlig afrunding. I ASP er der
> vidstnok to yderligere muligheder for enten at runde op eller ned til
> nærmeste helkal. Kan så ikke lige huske dem, men jeg har brugt dem
> engang i en demo af "terningekast".

Tror ikke min matematiklærer ville være glad for den...
Heltal har hverken komma eller decimaler.
Heltal er heltal. Hverken mere eller mindre. Og det er et
definitionsspørgsmål.

Det du tænker på, er formentlig at når man regner med heltal, er
resultatet ikke nødvendigvis også et heltal, og man kan være nødt til
at afrunde på forskellig vis, hvis det man har brug for, er et
heltal...

Der findes forskellige metoder i forskellige sprog - Round, Floor, Abs
- som man kan bruge, afhængig af hvordan man ønsker *decimaltallet*
afrundet til *heltal*...

^^

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Philip Nunnegaard (12-09-2011)
Kommentar
Fra : Philip Nunnegaard


Dato : 12-09-11 20:47

Rune Jensen skrev:

> I ASP er der
> vidstnok to yderligere muligheder for enten at runde op eller ned til
> nærmeste helkal. Kan så ikke lige huske dem, men jeg har brugt dem
> engang i en demo af "terningekast".

Har det været ubound og lbound?


--
Philip

Stig Johansen (13-09-2011)
Kommentar
Fra : Stig Johansen


Dato : 13-09-11 06:25

Philip Nunnegaard wrote:

> Har det været ubound og lbound?

Nej, ubound er det højeste index i et array i ASP.
Som Birger skriver, så hedder det lidt forskelligt i de forskellige sprog.
Afrunding hedder typisk Round, hvir man skal iagttage om det er 'Bankers
Rounding' - Jeg ved ikke hvad det hedder på dansk.

Typisk er en nedrunding = Floor (betyder gulv - nedad)
Oprunding ) Ceil (betyder loft - opad)

Der findes også sprog hvor nedrunding hedder Trunc - fjernelse af decimaler.

--
Med venlig hilsen
Stig Johansen

Rune Jensen (13-09-2011)
Kommentar
Fra : Rune Jensen


Dato : 13-09-11 09:43

On 12 Sep., 12:47, Philip Nunnegaard <nunnenos...@hitsurf.dk> wrote:
> Rune Jensen skrev:
>
> > I ASP er der
> > vidstnok to yderligere muligheder for enten at runde op eller ned til
> > nærmeste helkal. Kan så ikke lige huske dem, men jeg har brugt dem
> > engang i en demo af "terningekast".
>
> Har det været ubound og lbound?

Så vidt jeg kan læse ud af StackOverflow...

http://stackoverflow.com/questions/20675/asp-vbscript-int-vs-cint

cInt laver en afrunding af et kommatal, alt efter om det er tættest på
den øvre eller nedre, mens Int "hugger" decimalerne væk.

Så...

int(1.3) = 1

og int(1.7) = 1

men cInt(1.3) = 1

og cInt(1.7) = 2 - fordi 1.7 er tættere på 2 end på 1.

Synes bare, der også var noget lign. floor og ceil i ASP, men måske
husker jeg galt.


MVH
Rune Jensen

Dennis Munding (26-09-2011)
Kommentar
Fra : Dennis Munding


Dato : 26-09-11 13:55

Hej Rune,

"Rune Jensen" skrev...
Så vidt jeg kan læse ud af StackOverflow...

http://stackoverflow.com/questions/20675/asp-vbscript-int-vs-cint

cInt laver en afrunding af et kommatal, alt efter om det er tættest på
den øvre eller nedre, mens Int "hugger" decimalerne væk.

Så...

int(1.3) = 1

og int(1.7) = 1

men cInt(1.3) = 1

og cInt(1.7) = 2 - fordi 1.7 er tættere på 2 end på 1.

Synes bare, der også var noget lign. floor og ceil i ASP, men måske
husker jeg galt.


Uden at være ekspert på området, så kan jeg (ud fra det, jeg lærer p.t.), at
der er noget, der hedder floor i javascript.

Eks.:

minvar=Math.floor(Math.random()*20+1); /* Giver et tilfældigt heltal mellem
1 og 20 */

Men grundet min lærers manglende opdatering, er jeg ikke sikker på, at det
er korrekt.
Det virker dog i de 4 browsere jeg har testet i (Opera, FF, IE og Chrome -
alle med nyeste version).


Med venlig hilsen
--
Dennis Munding
a.k.a. The Eye - Member of the PosseGrim Squad
http://pgsquad.com/
"When you hear the wind - you're already dead..."


Birger Sørensen (26-09-2011)
Kommentar
Fra : Birger Sørensen


Dato : 26-09-11 15:05

Dennis Munding forklarede:
> Hej Rune,
>
> "Rune Jensen" skrev...
> Så vidt jeg kan læse ud af StackOverflow...
>
> http://stackoverflow.com/questions/20675/asp-vbscript-int-vs-cint
>
> cInt laver en afrunding af et kommatal, alt efter om det er tættest på
> den øvre eller nedre, mens Int "hugger" decimalerne væk.
>
> Så...
>
> int(1.3) = 1
>
> og int(1.7) = 1
>
> men cInt(1.3) = 1
>
> og cInt(1.7) = 2 - fordi 1.7 er tættere på 2 end på 1.
>
> Synes bare, der også var noget lign. floor og ceil i ASP, men måske
> husker jeg galt.
>
>
> Uden at være ekspert på området, så kan jeg (ud fra det, jeg lærer p.t.), at
> der er noget, der hedder floor i javascript.
>
> Eks.:
>
> minvar=Math.floor(Math.random()*20+1); /* Giver et tilfældigt heltal mellem 1
> og 20 */
>
> Men grundet min lærers manglende opdatering, er jeg ikke sikker på, at det er
> korrekt.
> Det virker dog i de 4 browsere jeg har testet i (Opera, FF, IE og Chrome -
> alle med nyeste version).
>
>
> Med venlig hilsen

Man kan blive klogere her:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math

ceil() runder op, floor() runder ned, round() runder til nærmeste
heltal.
- og Math kan en hel del mere...

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Dennis Munding (26-09-2011)
Kommentar
Fra : Dennis Munding


Dato : 26-09-11 18:23

Hej Birger,

"Birger Sørensen" <sdc@bbsorensen.com> skrev i meddelelsen
news:4e808678$0$289$14726298@news.sunsite.dk...
> Dennis Munding forklarede:
>> Men grundet min lærers manglende opdatering, er jeg ikke sikker på, at
>> det er korrekt.
>> Det virker dog i de 4 browsere jeg har testet i (Opera, FF, IE og
>> Chrome - alle med nyeste version).
>
> Man kan blive klogere her:
> https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math
>
> ceil() runder op, floor() runder ned, round() runder til nærmeste heltal.
> - og Math kan en hel del mere...

Kanon!
Den kigger jeg lige på - tak!


Med venlig hilsen
--
Dennis Munding
a.k.a. The Eye - Member of the PosseGrim Squad
http://pgsquad.com/
"When you hear the wind - you're already dead..."


Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409070
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste