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> 

AUSGÄNGE:Was ist mit dieser Funktion in der DecimalFormat() - Funktion von ColdFusion? Wie bekomme ich das richtige Ergebnis?

DecimalFormat (25,625): 25,62

DecimalFormat (18.125): 18,13

DecimalFormat (6,875): 6,88

STATT outputing:

D ecimalFormat (25,625): 25.63

DecimalFormat (18,125): 18.13

DecimalFormat (6.875): 6,88

Es scheint, dass eine Variable, die das Ergebnis einer mathematischen Berechnung macht DecimalFormat() anders verhalten. Jede schnelle Lösung, ohne in Java zu graben?

+0

auch, Number (number1, „.__“) macht das Gleiche. – Jayson

Antwort

4

Ich denke, das Problem ist nicht DecimalFormat() ist, aber die typischen Gleitkommazahlen Rundungsfehler.

sehen: PrecisionEvaluate()

+0

Sollte keine Gleitkommafehler sein, können alle diese Zahlen genau als eine Basis-2 Fließkommazahl ausgedrückt werden. (0.625 = 5/8, 0.125 = 1/8, 0.875 = 7/8. Da 8 eine Potenz von 2 ist, würde es keinen Rundungsfehler geben.) Ich gehe davon aus, dass ein "double" oder "float" verwendet wird die Abdeckungen ... – Kip

+0

das sagte, ich kann keinen Grund für die Ergebnisse sehen er sieht – Kip

+0

number1 = PrecisionEvaluate (20.5/80 * 100) erhalten Sie 25.62500000000000000000 -> 25.63 – Henry

2

DecimalFormat ist eine Formatierungsfunktion. Keine mathematische Funktion. Seine Aufgabe ist es nicht, Ihre Zahl für Sie zu runden, leider fehlen CF gute mathematische Funktionen für Dezimalzahlen, so dass Sie Ihre eigenen schreiben müssen.

Hier ist man jemand auf der CF-LiveDocs Seite für rundes schrieb():

<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

True, es ist eine Formatierungsfunktion, und ich habe es für die Ausgabe verwendet, aber es benötigt konsistent über Werte, ob berechnet oder nicht. Aber, gute Lösung, wenn Sie Zahlen für andere Mittel runden müssen ... – Jayson

-1

Bitte geben Sie die CF-Dokumentation NumberFormat und tun eine Seite Suche auf Runde sehen einige spezifische Informationen anzuzeigen.

0

Eine schnelle Lösung wäre Linie zu ändern 1-number1 = NumberFormat(20.5/80 * 100,'9.999')

Verwandte Themen