2017-06-23 16 views
5

Hmm Mam problem z zaokrągleniami po stronie klienta, które są następnie sprawdzane w backendach i sprawdzanie poprawności nie działa z powodu tego problemu. Oto poprzednie pytanie Javascript and C# rounding hellMnożenie daje przybliżone wyniki

Więc co robię jest:

po stronie klienta:

I have 2 numbers: 50 and 2.3659 
I multiply them: 50 * 2.3659 //118.29499999999999 
Round to 2 decimal places: kendo.toString(50 * 2.3659, 'n2') //118.29 

W backend (C#):

I am doing the same: 50 and 2.3659 
I multiply them: 50 * 2.3659 //118.2950 
Round to 2 decimal places: Math.Round(50 * 2.3659, 2) //118.30 

I walidacja się nie udaje. Czy mogę coś zrobić po stronie klienta?

+2

Masz świadomość, że [zmienna matematyka "jest zepsuta"] (https://stackoverflow.com/questions/588004/is-floating-point-math-broken), prawda? – deceze

+0

Dobrze, ale pytanie, co mogę zrobić w tym przypadku? Czy sugerujesz mi odrzucanie walidacji biznesowych i zgłaszanie nieprawidłowych wyników? –

+0

Pomnóż je jako liczby całkowite, a nie jako spacje. '50 * 23659' - następnie przenieś przecinek dziesiętny, jak uważasz. Wtedy uzyskasz wszędzie takie same wyniki. To nie jest idealne, ale zadziała. – Mjh

Odpowiedz

0

nie testowałem tego w znacznym stopniu, ale poniżej funkcja powinna naśladować 'MidPointToEven' zaokrągleń:

function roundMidPointToEven(d, f){ \t \t 
 
    f = Math.pow(10, f || 0); // f = decimals, use 0 as default 
 
    let val = d * f, r = Math.round(val); 
 
    if(r & 1 == 1 && Math.sign(r) * (Math.round(val * 10) % 10) === 5) 
 
    \t r += val > r ? 1 : -1; //only if the rounded value is odd and the next rounded decimal would be 5: alter the outcome to the nearest even number 
 
    return r/f; 
 
} 
 

 
for(let d of [50 * 2.3659, 2.155,2.145, -2.155, 2.144444, 2.1, 2.5]) 
 
    console.log(d, ' -> ', roundMidPointToEven(d, 2)); //test values correspond with outcome of rounding decimals in C#

0

można spróbować parseFloat i toFixed funkcje w następujący sposób:

var mulVal = parseFloat(50) * parseFloat(2.3659); 
    var ans = mulVal.toFixed(2); 
    console.log(ans); 
0

Arytmetyka JavaScript nie zawsze jest dokładna, a takie błędne odpowiedzi nie są niczym niezwykłym. Proponuję użyć Math.Round() lub var.toFixed(1) dla tego scenariusza.

Korzystanie Math.round:

var value = parseFloat(50) * parseFloat(2.3659); 
var rounded = Math.round(value); 
console.log(rounded); 

Drukuje 118 do konsoli.

Korzystanie toFixed() metoda:

var value = parseFloat(50) * parseFloat(2.3659); 
var rounded = value.toFixed(1); 
console.log(rounded); 

Drukuje 118.3 do konsoli.

Należy pamiętać, że użycie toFixed(2) spowoduje podanie wartości jako 118.29.

Mam nadzieję, że to pomoże!

+0

Tak i potrzebuję zaokrąglić do 2, i masz szczęście, że do Fixed (1) podał wynik rdzenia ... –

Powiązane problemy