2009-09-15 10 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> 

SALIDAS:¿Qué sucede con esto en la función DecimalFormat() de ColdFusion? ¿Cómo obtengo el resultado correcto?

DecimalFormat (25,625): 25,62

DecimalFormat (18,125): 18,13

DecimalFormat (6.875): 6,88

EN LUGAR DE outputing:

D ecimalFormat (25.625): 25.63

DecimalFormat (18.125): 18.13

DecimalFormat (6.875): 6,88

Parece que una variable que es el resultado de un cálculo matemático hace DecimalFormat() se comportan de manera diferente. Cualquier solución rápida, sin cavar en Java?

+0

también, NumberFormat (number1, ".__") hace lo mismo. – Jayson

Respuesta

4

Creo que el problema no es DecimalFormat(), pero los típicos errores de redondeo de punto flotante.

ver: PrecisionEvaluate()

+0

No debería haber ningún error de coma flotante, todos estos números pueden expresarse exactamente como un número de coma flotante de base 2. (0.625 = 5/8, 0.125 = 1/8, 0.875 = 7/8. Dado que 8 es una potencia de 2, no habría error de redondeo.) Supongo que se usa un 'doble' o' flotar' bajo las cubiertas ... – Kip

+0

que dicen, no puedo pensar en ninguna razón para los resultados que está viendo – Kip

+0

número1 = PrecisionEvaluate (20.5/80 * 100) obtendrá 25.62500000000000000000 -> 25.63 – Henry

2

DecimalFormat es una función de formateo. No es una función matemática. Su trabajo no es redondear su número por usted, lamentablemente CF carece de buenas funciones matemáticas para decimales, por lo que tendrá que escribir el suyo propio.

Aquí está uno que alguien escribió en la página del CF LiveDocs para la ronda():

<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

Es cierto que es una función de formateo, y la estaba utilizando para la salida, pero la necesitaba para que funcionara de manera consistente entre los valores, ya sea que se calculó o no. Pero, una buena solución si necesita redondear números para otros medios ... – Jayson

-1

Por favor, consulte la documentación CF NumberFormat y hacer una búsqueda en la página redonda ver alguna información específica.

0

Una solución rápida sería cambiar la línea 1 a number1 = NumberFormat(20.5/80 * 100,'9.999')

Cuestiones relacionadas