0,01 --> 1/100
22 svar · 1 462 visningar · startad av Fredriksson
dim tal
tal = 0.01
Response.Write (tal*100) & "/100"
Inte riktigt vad jag söker men jag bör nog förklara lite mer... :)
Dom värden jag har är sekunder och ser ut t ex så här:
0,000625
0,40
2
0,0001
etc
Och jag vill att dom ska skriva ut så här:
2 (vid hela sekunder ska alltså inget göras)
1/1000
1/40
1/100
etc
Vet du att ditt tal alltid kan skrivas som ett rationellt tal? Eller kan det förekomma godtyckliga decimaltal?
Hur menar du?
Har i alla fall aldrig stött på att talen ser ut på något annat sätt än mina exempel ovan.
Öh, nehej, då kan jag tala om att det bara är vissa decimaltal som med enkelhet kan skrivas som bråk. Till exempel kan 0.5 skrivas som 1/2.
Men talet 0.76398293847298742394872982734987234 är lite svårare att skriva som ett bråk.
Jag stöter på sådana tal relativt ofta.
Det rör sig om EXIF-information från en kamera gällande slutartid. Och inställning av slutartid görs i formatet 1/100, 1/200 etc så därför bör det bara vara sånna värden som är aktuella.
Ingen som vet?
Pseudokod, kan inte ASP.
if t >= 1 then
// alla t >= 1 är enligt förutsättningarna ett heltal.
resultStr = SträngAvTal(t)
else
// alla t <= 1 invers 1/t är enligt förutsättningarna bara avrundningsfel från ett heltal.
resultStr = AddStr("1/",SträngAvTal(AvrundaTillHeltal(1/t))
end if
Nu är jag inte haj på ASP, men som pseudokod:
num:int = 0.4 // decimalnummer vi vill omvandla till bråk
for(i=1;i<10000;i++){
if(round(i * num) == i * num){
print((i*num)+"/"+i)
break
}
}
Säkert inte det smartaste och effektivaste sättet att köra med en loop, men det borde funka iaf.
Tja, om du tar t.ex. 1/0,000625 så får du 1600, och jag antar att 0,000625 betyder 1/1600 sekunders slutartid, så om slutartiderna alltid är på formen 1/x är det väl rätt enkelt. Om slutartid > 1, skriv ut slutartid, annars skriv ut "1/" & (1 / slutartid) typ.
red. D'oh, slagen.
Om 0.40 är ett nummer som förekommer så är ju det 2/5...är det en miss eller finns det som slutartid?
Är det alltid 1/x är i2n2's lösning smidigare, men med 0.40 får du 1/2.5
Blixtsystems skrev:
Om 0.40 är ett nummer som förekommer så är ju det 2/5...är det en miss eller finns det som slutartid?
Är det alltid 1/x är i2n2's lösning smidigare, men med 0.40 får du 1/2.5
Jag slarvade alltså ännu en gång med att läsa förutsättningarna och litade på min erfarenhet av att min enkla digitalkamera alltid visar 1/heltal som slutartider.
Tack för svaren!
Vore tacksam om nån kunde översätta det till ASP...
num:int = 0.4 // decimalnummer vi vill omvandla till bråk
for(i=1;i<10000;i++){
if(round(i * num) == i * num){
print((i*num)+"/"+i)
break
}
}
Blir Precis samma fast med ASP syntax:
dim i, num
num = 0.4
for i=1 to 10000
If Round(i * num) = i * num Then
Response.Write (i*num) & "/" & i
Exit For
End If
Next
Förutom att det inte är någon typing på "num" som jag av någon märklig anledning angett som int, så din kod fungerar förmodligen i motsats till min :)
Vad min snutt saknar är en koll om vi redan har ett heltalsnummer, så 2 kommer resultera i "2/1".
Vill du undvika det får du lägga till något i stil med:
If Round(num) = num Then
Response.Write num
Else
//loopen
End if
Kanske lite offtopic men... Enligt Exif Version 2.2 så är "ExposureTime" i filen lagrad som två 32-bitars heltal (RATIONAL - The first LONG is the numerator and the second LONG expresses the denominator.) så om man hämtar informationen direkt från bildfiler så borde inte problemet existera.
Om man med php-funktionen exif_read_data tittar på EXIF informationen på de testbilder som finns på exif.org så får jag t.ex.
canon-ixus.jpg EXIF ExposureTime 1/350
fujifilm-dx10.jpg COMPUTED ExposureTime 0.010 s (1/97)
fujifilm-finepix40i.jpg COMPUTED ExposureTime 0.022 s (1/45)
fujifilm-mx1700.jpg COMPUTED ExposureTime 0.006 s (1/169)
kodak-dc210.jpg EXIF ExposureTime 1/30
kodak-dc240.jpg EXIF ExposureTime 1/30
nikon-e950.jpg EXIF ExposureTime 10/770
olympus-c960.jpg EXIF ExposureTime 1/345
ricoh-rdc5300.jpg COMPUTED ExposureTime 0.011 s (1/91)
sanyo-vpcg250.jpg EXIF ExposureTime 1/171
sanyo-vpcsx550.jpg EXIF ExposureTime 10/483
sony-cybershot.jpg EXIF ExposureTime 1/197
sony-d700.jpg COMPUTED ExposureTime 0.031 s (1/32)
Även om värden som 10/483 inte känns riktigt som standard så är det kanske något man kan leva med.
Funkar tyvärr fortfarande inte...
Blixtsystems: ASP kan du inte typa variablerna.
Fredirksson: Hur fungera det inte? Jag får ut 2/5 när jag testar. Så Visst fungera koden... kanske inte riktigt som du vill men då får man kommentera på vilket sätt det inte fungera.
Jag testar den på olika bilder och då får jag ibland inget värde alls.
Och sen så vill ja gärna att det ska skrivas ut på samma sätt som slutartid anges dvs som t ex 1/300.