AGMedlem sedan mars 20001 266 inlägg Phu, står helt still.
Att göra en loop med en vanlig int är inget problem. Nu skulle jag dock vilja göra en med double som loopar enligt följande.
0.00
0.01
0.02
0.03
.....
0.99
1.00
Meningen är att den skall skriva ut en droplist på en jsp-sida:
<option value="0.00">0%</option>
<option value="0.01">1%</option>
<option value="0.02">2%</option>
<option value="0.03">3%</option>
<option value="0.04">4%</option>
...
Men nu står det helt still.
Andreas
tydalMedlem sedan juni 20034 013 inlägg Det är ingen double du ska ha. Det är en int.
Typ pseudokod (eftersom jag inte kan java) :
for (int i = 0; i < 100; i++)
{
if (i < 10)
// Skriv ut 0.0 följt av i.
else
// Skriv ut 0. följt av i.
}
// Skriv ut 1.00.
AGMedlem sedan mars 20001 266 inlägg Är detta inte en begränsning. Känns som att det borde gå att lösa enklare.
Andreas
LimeMedlem sedan sep. 2001961 inlägg Så här kanske???
<%@ page import="java.text.*"%>
<html>
<h1>Testsida för Options</h1>
<%
double percent = 0.0;
%>
<select>
<%
NumberFormat doubleFormatter = NumberFormat.getInstance();
doubleFormatter.setMinimumFractionDigits(2);
for(int i=0; i<=100; i++)
{
%>
<option value='<%=doubleFormatter.format(percent)%>'><%=i%>%</option>
<%
percent = percent + 0.01;
}
%>
</select>
</html>
Testa med att plocka bort NumberFormatter'n och se vilken kul effekt det blir... :D
AGMedlem sedan mars 20001 266 inlägg Perfekt, dock skulle jag behöva hjälp med ytterligare en sak.
Koden skall användas i ett registreringsfält. Rad som är "selected" är där "form.getPercent() = percent" om null är fält 15% selected.
Hur skiver man då, står helt still.
Andreas
LimeMedlem sedan sep. 2001961 inlägg
AG skrev:
Perfekt, dock skulle jag behöva hjälp med ytterligare en sak.
Koden skall användas i ett registreringsfält. Rad som är "selected" är där "form.getPercent() = percent" om null är fält 15% selected.
Hur skiver man då, står helt still.
Andreas
Såhär:
<%@ page import="java.text.*"%>
<html>
<h1>Testsida för Options</h1>
<select>
<%
double percent = 0.0;
double formPercent = 0.90;
%>
<%
NumberFormat doubleFormatter = NumberFormat.getInstance();
doubleFormatter.setMinimumFractionDigits(2);
String selected;
long d1;
long d2 = Double.doubleToRawLongBits(formPercent);
for(int i=0; i<=100; i++)
{
d1 = Double.doubleToRawLongBits(percent);
selected = "";
if((d2 != -1) && (Double.compare(d1, d2) == 0))
{
selected = "SELECTED";
}
else if ((formPercent == -1) && (i==15))
{
selected = "SELECTED";
}
%>
<option value='<%=doubleFormatter.format(percent)%>' <%=selected%> ><%=NumberFormat.getPercentInstance().format(percent)%></option>
<%
percent = percent + 0.01;
}
%>
</select>
</html>
Dock tycker jag att du borde fundera på om du verkligen ska använda double och inte long direkt istället. Double är inte helt exakt...
ViktorMedlem sedan aug. 20021 752 inlägg Tråd flyttad från Java forumet.
/Viktor
AGMedlem sedan mars 20001 266 inlägg Tack Lime.
Låter självklart att jag skall använda long om double ej är exakt. Varför är det så?
Andreas
LimeMedlem sedan sep. 2001961 inlägg
AG skrev:
Tack Lime.
Låter självklart att jag skall använda long om double ej är exakt. Varför är det så?
Andreas
Njea... egentligen är det det... det var jag som skrev fel. Float är inte exakt. Double är mer exakt. Blev lite osäker och var tvungen att grotta ner mig i specen för JVM och insåg att det är skillnad på 0.1, 0.1f och 0.1d.
Varför man får lite lustiga fenomen med flyttal och framför allt float är beroende på hur det är implementerat. Alla flyttal representeras av en bit-mönster. Enligt javaspecen så är flyttal representerade av ett bitmönster där först biten är tecknet (+ eller -), de följande 8 är exponenten och de sista 23 är signifikanten (alltså ±b0.b1b2b3...bn-1 * 2exponent ). Man räknar ut en float med formeln (-1)s ·(b0 + b1·2-1 + b2·2-2 + b3·2-3 + ...+ bn-1·2-(n-1))·2exponent.
En double är uppbyggd på liknande sätt men har 11 bitar som representerar exponenten och 52 som är signifikanten.
Det gör att en float ger 6 till 9 decimalers precition medans en float ger 15 till 17... lite skillnad.
Eftersom det inte går att representera alla floats med bittmönstret så betyder det att t.ex. 0.1f får doublevärdet 0.10000000149011612...
Det är alltså upp till implementatören av JVM:en att själv bestämma hur man ska hantera float och double...
Enklast gör man det genom att använda sig av klasserna Float och Double. Om man behöver vara EXAKT så finns det andra klasser, som t.ex. BigDecimal, som ger bättre precition. GNU har också skrivit ett antal Math-klasser som ger avsevärt mycket bättre upplösning.
Så en rekommendation är att man skall undvika att jämföra floats och doubles direkt med varandra... och om man vill ha bara 2 decimalers nogrannhet så säger man åt Double-klassen att runda av...
För att grotta ner sig helt i detta med att representera flyttal som bit-mönster så ska man söka på IEEE 754.
Långt och krångligt svar... någon som förstod någon?? (Får förmodligen någon känga av Spango eftersom han är doktorand och det är inte jag... jag bara jobbar med skiten...)
AGMedlem sedan mars 20001 266 inlägg Får ett mindre problem "<%=doubleFormatter.format(percent)%>" skriver ut med separator ",". Detta medans en vanlig double skriver ut med separator ".".
När jag skall plocka in värdet från formuläret:
double percent = 0.0;
double formPercent;
try {
formPercent = Double.parseDouble(form.getformPercent());
} catch(NumberFormatException nfe){
formPercent = 0.91;
}
Skriver den således ut fel, ex form.getformPercent() = 0,22 (alltså kommaseparerat)
Något förslag på lösning?
mvh
Andreas
LimeMedlem sedan sep. 2001961 inlägg Nej, det är helt korrekt format. Vad doubleFormat gör är att den kollar vilket Locale som systemet kör på och sedan använder den sig av det format som är standard för det landet.
Om man t.ex. ändrar till amerikans locale på datorn så skriver den ut med en punkt istället.
Om du svänger på det så du använder i som value och det du får ur numberformater som visningsvärde så borde det lösa sig.
Du kan också fundera på att kanske använda en integer som värde för procenten istället eftersom du bara har fasta procenttal...
AGMedlem sedan mars 20001 266 inlägg Hur menar du då Lime. Vill försöka använda mig efter amerikansk typ. i som value?
Tack
Andreas
LimeMedlem sedan sep. 2001961 inlägg Nu vet jag ju inte riktigt vad det är du ska göra men om du använder int i från for(int i=0; i<=100; i++) som värde till value i select-boxen så kan du ju använda denna och bara dela med 100 i de beräkningar du behöver göra.
Själva OPTION-taggen skapas då såhär.
<option value='<%= i %>' <%=selected%> ><%=NumberFormat.getPercentInstance().format(percent)%></option>
AGMedlem sedan mars 20001 266 inlägg Klart, tack för hjälpen. Blev int tillslut.
<select name="percent">
<%
int tm_percent;
try {
tm_percent = Integer.parseInt(form.getPercent());
} catch(NumberFormatException nfe){
tm_percent = 15;
}
for(int i=0; i<=100; i++)
{
selected = "";
if(tm_percent == i){
selected = "selected";
}
out.println("<option value='"+i+"' "+selected+">"+i+"%</option>");
}
%>
</select>
Andreas