2009-09-15 4 views
5
<cfset number1 = 20.5/80 * 100 /> 
<cfset number2 = 18.125 /> 
<cfset number3 = 6.875 /> 

<cfoutput> 
DecimalFormat(#number1#): #DecimalFormat(number1)#<br /> 
DecimalFormat(#number2#): #DecimalFormat(number2)#<br /> 
DecimalFormat(#number3#): #DecimalFormat(number3)# 
</cfoutput> 

USCITA:Che cosa succede con la funzione DecimalFormat() di ColdFusion? Come ottengo il risultato corretto?

DecimalFormat (25,625): 25,62

DecimalFormat (18,125): 18,13

DecimalFormat (6.875): 6,88

ANZICHE outputing:

D ecimalFormat (25,625): 25.63

DecimalFormat (18,125): 18.13

DecimalFormat (6.875): 6.88

Sembra che una variabile che è il risultato di un calcolo matematico rende DecimalFormat() si comporta diversamente. Qualche soluzione rapida, senza scavare in java?

+0

anche, NumberFormat (numero1, ".__"), fa la stessa cosa. – Jayson

risposta

4

Credo che il problema non è DecimalFormat(), ma i tipici in virgola mobile errori di arrotondamento.

vedere: PrecisionEvaluate()

+0

Se non dovessero esserci errori in virgola mobile, tutti questi numeri possono essere espressi esattamente come un numero in virgola mobile a base 2. (0,625 = 5/8, 0,125 = 1/8, 0,875 = 7/8. Poiché 8 è una potenza di 2, non ci sarebbe alcun errore di arrotondamento.) Sto assumendo un 'double' o' float' è usato sotto le copertine ... – Kip

+0

detto, non riesco a pensare a nessun motivo per i risultati che sta vedendo – Kip

+0

numero1 = PrecisionEvaluate (20,5/80 * 100) otterrà 25,62500000000000000000 -> 25,63 – Henry

2

DecimalFormat è una funzione di formattazione. Non una funzione matematica. Il suo compito non è quello di arrotondare il tuo numero per te, sfortunatamente CF non ha buone funzioni matematiche per i decimali, quindi dovrai scrivere il tuo.

Ecco uno qualcuno ha scritto sulla pagina CF LiveDocs per round():

<cffunction name="roundDecimal" returntype="numeric"> 
    <cfargument name="num" type="numeric" required="yes"> 
    <cfargument name="decimal" type="numeric" default="2" required="no"> 

    <cfreturn round(num*10^decimal)/10^decimal /> 
    </cffunction> 
+0

È vero, è una funzione di formattazione e io la stavo usando per l'output, ma avevo bisogno che funzionasse in modo coerente tra i valori calcolati o meno. Ma, buona soluzione se hai bisogno di arrotondare i numeri per altri mezzi ... – Jayson

-1

consultare la documentazione CF NumberFormat e fare una ricerca pagina su rotonda di vedere alcune informazioni specifiche.

0

Una soluzione rapida sarebbe quella di cambiare la linea 1-number1 = NumberFormat(20.5/80 * 100,'9.999')