Visualizzazione dei risultati da 1 a 3 su 3

Discussione: ACCESS funzione ROUND

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    residenza
    San Marino
    Messaggi
    54

    ACCESS funzione ROUND

    Salve,
    ho gia postato una cosa similie (vedi "ACCESS arrotondare (senza sbagliare)") ma qui si tratta di una questione diversa (anche se mi serve per risolvere lo stesso problema), spero di essere in regola con le norme del forum.

    Sto usando Access 2000 (ver.9.0.3821 SR-1) -non commentate, questo ho- su PC Windows XP.

    Per arrotondare il campo IVA al 2° decimale ho trovato la funzione ROUND e la uso con questa sintassi in una query di selezione:

    arrotIVA: Round([iva];2)

    Ora applicando la query alla tabella che contiene i valori IVA da arrotondare ho riscontrato questo singolare comportamento nei risultati:

    iva originale -----> iva (valore arrotondato)
    ------------------------------------------
    17,50901002 ---> 17,51
    17,955 -----------> 17,95 <----- eeeeeh???
    17,9 --------------> 17,9
    17,855 -----------> 17,86
    17,755 -----------> 17,76

    La query nella 2° riga da un valore IVA arrotondato SBAGLIATO, deve dare 17,96 come nei casi simili della 4° e 5° dove infatti i valori arrotondati sono corretti.
    Ho provato e ho verificato che l'errore avviene solo quando il primo decimale è uguale a 9 (quindi funziona bene con 17,055 17,155 17,255 ecc.)
    Qualcuno mi spiega come può succedere una cosa del genere? Grazie.
    Inutile dire che sto fondendo...


    PS: almeno ditemi che fa così anche da voi
    PEO from RSM
    www.peogio.net

  2. #2
    È normale, dato che stai lavorando con dei Double (che sono di fatto numeri binari in virgola mobile).
    17.955 in decimale è rappresentabile esattamente con un numero di cifre finite; in binario, invece, è un numero periodico (come mostra Wolfram Alpha). Dato che in Double il numero di cifre della mantissa è limitato, il periodo deve essere ovviamente troncato ad un certo punto, per cui quando tu scrivi 17.955 quello che il computer vede effettivamente è in verità 17.9549999999999982946974341757595539093017578125. È naturale quindi che l'arrotondamento fornisca 17.95, visto che la cifra dopo il primo 5 per il computer è in realtà un 4.

    È per motivi di questo genere che i tipi binari in virgola mobile non vanno mai utilizzati per importi monetari; bisogna invece usare tipi decimali in virgola mobile - o volendo anche in virgola fissa.
    A tal proposito, VBA fornisce il tipo Currency (di fatto è un intero a 64 bit scalato implicitamente di un fattore 10000) che dovrebbe essere usato sempre quando si fanno conti monetari (e analogamente nelle colonne di database). Non so però quanto supporto di libreria ci sia per operazioni non basilari (percentuali, potenze, arrotondamenti, ...) per questo tipo.
    ---EDIT---
    Sembra che la round funga correttamente: provando dalla finestra "Immediata" di VBA vedo:
    codice:
    a=17.955            ' questa è una variabile di tipo Double
    print VarType(a)=vbDouble
    Vero
    b=17.955@           ' questa è di tipo Currency
    print VarType(b)=vbCurrency
    Vero
    print Round(a, 2)   ' qui ottengo il risultato sbagliato
     17,95 
    print Round(b, 2)   ' qui quello giusto
     17,96
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2010
    residenza
    San Marino
    Messaggi
    54
    Mamma mia che difficile!!!

    Se ho ben capito (e ne dubito) dovrei risolvere il problema memorizzando nella tabella i dati relativi agli importi in formato "valuta" (Currency), come segue:
    nome campo: IVA
    dimensione campo: Precisione doppia
    formato: Valuta
    posizioni decimali: 2

    Quindi andarci ad accodare tramite query i dati arrotondati con la funzione round all'atto della fatturazione, come segue:
    arrIVA: Round([Importo]*[Aliquota]/100;2)

    Questo è il risultato che dovrei ottenere:
    ---------------------------------------
    Imponibile = 85,50
    IVA (21%) = 17,955 arrotondato a 17,96
    TotFattura =103,455 arrorondato a 103,46

    Purtroppo questo è quello che ottengo:
    -------------------------------------
    Imponibile = 85,50
    IVA (21%) = 17,95
    TotFattura =103,45

    Quindi in realtà non mi funziona ancora... come mai?

    Due cose:
    1) noto che il campo nella tabella che io ho impostato a "valuta" e salvata, alla riaperutra della stessa è cambiato -da solo- in "euro", è normale?
    2) io lavoro con le query classiche, posso? o devo usare per forza vba per ottenere il risultato giusto?

    Help me please!!
    Grazie
    PEO from RSM
    www.peogio.net

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.