Avatar billede mikmakmuk Nybegynder
05. december 2003 - 01:19 Der er 31 kommentarer og
1 løsning

Problem med at runde af

Hej Eksperter,

Jeg henter en pris fra min database (MySQL) således

double pris      = rs.getDouble("vare_pris");

i databasen er prisen en decimal(10,2)

Mit problem er at når jeg ganger op med antal får jeg ikke det forventede. 44*9.95 giver 437.79999999999995 i stedet for 437.8. Jeg er interesseret i at vise min pris som 0.00
Avatar billede 2c Nybegynder
05. december 2003 - 01:27 #1
Gang dit resultat med 100. Cast til integer. Divider med 100 igen.

Der er dog sikkert en smartere metode :-)
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 01:32 #2
Man skulle da tro at der findes en metode i JAVA som kan det
Avatar billede 2c Nybegynder
05. december 2003 - 01:49 #3
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 02:04 #4
Det er bare en værdi jeg skal have rundet af. Jeg leder efter noget i den her stil round(55555555.5555,2);
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 02:06 #5
Jeg kan finde den her
Math.round(55555555.6666);
men jeg vil jo gerne have 2 decimaler på
Avatar billede 2c Nybegynder
05. december 2003 - 02:08 #6
Jep. Jeg ved ikke lige om den metode findes i java. Round i Math bibliotektet afrunder bare til nærmeste hele tal. Det eksempel jeg linker til viser resultatet som 0.00kr.

....

Double currency = new Double(9876543.21);
NumberFormat currencyFormatter;
String currencyOut;

currencyFormatter = NumberFormat.getCurrencyInstance(currentLocale);
currencyOut = currencyFormatter.format(currency);
System.out.println(currencyOut + " " +            
                  currentLocale.toString());
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 02:12 #7
okay, hvad skal jeg importerer
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 02:17 #8
Den ved ikke hvad

    NumberFormat currencyFormatter;

er :-(
Avatar billede 2c Nybegynder
05. december 2003 - 02:20 #9
import java.util.*;
import java.text.*;

Derudover skal du foresten også lige oprette variablen currentLocale.
Locale currentLocale = new Locale("da", "");
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 02:24 #10
Locale currentLocale = new Locale("da", "");
er den ikke med på, hvad betyder det i øvrigt
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 02:25 #11
cannot resolve symbol
symbol  : class Locale
location: class Tordre
        Locale currentLocale = new Locale("da", "");
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 02:31 #12
tak for hjælpen :-)
Avatar billede 2c Nybegynder
05. december 2003 - 02:36 #13
Det gør at den udskriver din værdi på dansk. Havde det for eksempel været new Locale("en", ""); ville den udskrive det på engelsek.

eksempel
på engelsk: $9.21
på dansk: 9,21 kr.
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 02:37 #14
oki
Avatar billede 2c Nybegynder
05. december 2003 - 02:42 #15
Jeg ved ikke hvorfor den ikke kender "Locale".

Har du husket at imorterer java.util.*; ?
Avatar billede 2c Nybegynder
05. december 2003 - 02:45 #16
imorterer = importere
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 02:45 #17
Nej det havde jeg glemt :-) OOOOoooo(måske burde man gå i seng *lol*)

Kan jeg slippe for at der står kr foran.
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 02:47 #18
Det er fordi værdien skal ind i en tabel, og jeg vil derfor gerne have tallene til at stå pænt under hinanden.
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 02:49 #19
formattet ser således ud lige nu

kr 437,80
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 02:55 #20
kr 55,00
  kr 5,95
kr 202,30

syntes jeg ikke ser så pænt ud :-)
Avatar billede 2c Nybegynder
05. december 2003 - 03:13 #21
Et grimt hack ville være:

currencyOut=currencyOut.replaceFirst("kr ","");

Før du skrev ud.
Ellers ved jeg ikke hvordan du skulle gøre :-(
Avatar billede arne_v Ekspert
05. december 2003 - 07:39 #22
som hovedregel: brug *ALDRIG* float og double til beløb

Alternativer:

database            Java

integer              int

decimal              BigDecimal
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 10:27 #23
Grunden til aqt jeg bruger double er at det er den eneste måde jeg kan finde ud at hente værdien fra min database.

double pris      = rs.getDouble("vare_pris");

Jeg er meget interesseret i se et forslag til hvordan man ellers kunne gøre
Avatar billede arne_v Ekspert
05. december 2003 - 10:32 #24
Lav felt typen til decimal eller numeric i databasen og hent med:

BigDecimal pris = rs.getBigDecimal("vare_pris");

[BigDecimal er i java.math pakken]
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 10:45 #25
okay, men hvorfor kan jeg nu ikke gange med en int

buffer.append("<td style=\"text-align:right;\" class=\"tablecell1\">"+pris*stk+"</td>\n");

operator * cannot be applied to java.math.BigDecimal,int
Avatar billede arne_v Ekspert
05. december 2003 - 10:50 #26
Java understøtter ikke operator overload.

Derfor skal du kalde metoder på BigDecimal for at lave +-*/.

Og jeg skal beklage, hvis jeg har givet dig indtryk af at BigDecimal
er "nem" at bruge.

Men i professionel sammenhæng vil man ikke bruge double/Double til
beløb. Man vil før eller siden få nogen sære afrundings fejl.
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 11:08 #27
Så ser det således ud. Jeg har kigget i API'et og fundet en metode som hedder multibly, men jeg kan ikke se hvordan jeg skal bruge den

BigDecimal  pris  = rs.getBigDecimal("vare_pris");
int stk          = rs.getInt("stk");
Avatar billede arne_v Ekspert
05. december 2003 - 11:15 #28
Eksempel:

import java.math.*;

public class BigTest {
    public static void main(String[] args) {
        BigDecimal pris = new BigDecimal(5.25);
        int stk = 10;
        BigDecimal sum = pris.multiply(BigDecimal.valueOf(stk));
        System.out.println(pris + " * " + stk + " = " + sum);
    }
}
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 11:43 #29
Hmmm. Jeg skulle jo gerne have sat pris ind, men det her er åbenbart ikke lovligt

BigDecimal pris1 = new BigDecimal(pris);
Avatar billede arne_v Ekspert
05. december 2003 - 12:07 #30
Ikke forstået.

BigDecimal  pris  = rs.getBigDecimal("vare_pris");
int stk          = rs.getInt("stk");
BigDecimal sum = pris.multiply(BigDecimal.valueOf(stk));
Avatar billede mikmakmuk Nybegynder
05. december 2003 - 12:13 #31
okay så virker det.
Avatar billede 2c Nybegynder
05. december 2003 - 15:58 #32
Du må hellere få points arne. Det er jo dig der har besvaret spørgsmålet :-)

http://www.eksperten.dk/spm/436382
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester