2017-06-23 9 views
5
を与える

うーん、私はその後、バックエンドで検証されており、検証がこの問題に起因する障害が発生しているクライアント側の丸みに問題があります。ここで私はやっているものを前の質問だから、Javascript and C# rounding hell乗算は、おおよその結果

がされている。バックエンドで

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 

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 

とクライアント側で

検証は失敗しています。クライアント側で何かできますか?

+2

あなたがいることを認識している[浮動数学は "壊れている"](https://stackoverflow.com/questions/588004/is-floating-point-math-broken)、右? – deceze

+0

ですが、この場合、どうすればいいですか?あなたはビジネスのバリデーションを捨て、間違った結果をコミットするように私に勧めますか? –

+0

浮動小数点数ではなく、整数としてそれらを掛けます。 '50 * 23659' - 小数点を移動します。それから、どこでも同じ結果が得られます。それは理想的ではありませんが、うまくいくでしょう。 – Mjh

答えて

0

は広範囲にこれをテストしていませんが、以下の機能は、 'MidPointToEven' 丸めをエミュレートする必要があります。次のように

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

あなたはparseFloatはとtoFixed機能を試すことができます:

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

Javascript算術演算は必ずしも正確ではなく、このような誤った答えは珍しいことではありません。このシナリオでは、Math.Round()またはvar.toFixed(1)を使用することをお勧めします。コンソールに

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

プリント118:恐らくMath.roundを使用して

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

プリント118.3コンソールへ:toFixed()メソッドを使用し

toFixed(2)を使用して118.29としての価値を与える

注意。

希望すると便利です。

+0

はい、私は2に丸める必要があり、あなたはtoFixed(1)がcorectの結果を与えたことは幸いです... –

関連する問題