2017-06-23 3 views
0

Wie Sie Genie aufgrund wissen Rundungsregel in C# wir die folgenden Werte erhalten:Javascript und C# Runde Hölle

decimal d = 2.155M; 
var r = Math.Round(d, 2); //2.16 

decimal d = 2.145M; 
var r = Math.Round(d, 2); //2.14 

Jetzt auf Client-Seite in Javascript Ich erhalte:

2.155.toFixed(2) 
"2.15" 

2.145.toFixed(2) 
"2.15" 

kendo.toString(2.155, 'n2') 
"2.16" 

kendo.toString(2.145, 'n2') 
"2.15" 

Aber Ich habe Validierungen im Backend, die dadurch fehlschlagen. Was ist der richtige Weg, um mit dieser Art von Situation umzugehen? Wie kann ich C# und Javascript Rundungen synchronisieren, um sicherzustellen, dass beide auf die gleichen Werte runden?

Antwort

5

Es gibt einen overload in C#´s Math.Round, der einen Indikator akzeptiert, der angibt, wie abgerundet wird, wenn die Nummer auf halbem Wege zwischen zwei anderen liegt. Z.B. MidPointToEven rundet das 0,5 bis Null als Null ist die neartest gerade Zahl:

decimal d = 2.155M; 
var r = Math.Round(d, 2, MidPointRounding.AwayFromZero); //2.16 

decimal d = 2.145M; 
var r = Math.Round(d, 2, MidPointRounding.AwayFromZero); //2.15 

Per defualt MidPointToEven verwendet wird Ihre Nummer und wird immer auf die nächste auch Zahl gerundet werden. Thuis erhalten Sie diese Ergebnisse:

2.155 --> 2.16 
2.145 --> 2.14 
+0

Verpasst, dass einer. Vielen Dank! Mein Problem ist komplett auf Javascript Seite und ich werde eine neue Frage erstellen. –

5

Sie können die midpoint rounding Regel angeben, die in C# verwendet werden:

decimal d = 2.145M; 
var r = Math.Round(d, 2, MidpointRounding.AwayFromZero); //2.15 

Der Standardwert für Dezimalzahlen ist MidpointRounding.ToEven AKA banker's rounding, speziell die Vorspannung über mehrere zu minimieren Rundungsoperationen

Die Methode der runden Halbwertsgleichheit behandelt positive und negative Werte symmetrisch und ist daher frei von Vorzeichen. Noch wichtiger ist, dass bei vernünftigen Verteilungen von y-Werten der Durchschnittswert der gerundeten Zahlen der gleiche ist wie der der ursprünglichen Zahlen. Diese Regel führt jedoch zu einer Vorspannung von Null, wenn y - 0.5 gerade ist, und zu einer Unendlichkeit, wenn ungerade ist. Darüber hinaus verzerrt es die Verteilung, indem es die Wahrscheinlichkeit der Gleichheit relativ zur Wahrscheinlichkeit erhöht.

+0

Danke, hab es! –