Javascript和C#舍入地狱

Gio*_*uri 1 javascript c# kendo-ui

如您所知,由于天才舍入规则,C#我们得到以下值:

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

decimal d = 2.145M;
var r = Math.Round(d, 2); //2.14
Run Code Online (Sandbox Code Playgroud)

现在在客户端,Javascript我得到:

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"
Run Code Online (Sandbox Code Playgroud)

但是我在后端的验证是因为这个失败了.处理这种情况的正确方法是什么?我如何同步C#Javascript舍入以确保它们都是相同的值?

Him*_*ere 6

在C#的Math.Round中有一个超载接受一个指示器,当数字在另外两个数据之间的中途时,如何舍入.例如,MidPointToEven将0.5舍入为零,因为零是最近的偶数:

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
Run Code Online (Sandbox Code Playgroud)

根据defualt MidPointToEven使用,您的号码将全部四舍五入到最接近的偶数.你可以得到那些结果:

2.155 --> 2.16
2.145 --> 2.14
Run Code Online (Sandbox Code Playgroud)


Luc*_*ski 5

您可以指定要在C#中使用的中点舍入规则:

decimal d = 2.145M;
var r = Math.Round(d, 2, MidpointRounding.AwayFromZero); //2.15
Run Code Online (Sandbox Code Playgroud)

小数的默认值是MidpointRounding.ToEvenAKA 银行家的舍入,它旨在最大限度地减少多次舍入操作的偏差.

圆半到均匀方法对称地处理正值和负值,因此没有符号偏差.更重要的是,对于y值的合理分布,舍入数字的平均值与原始数字的平均值相同.然而,当y-0.5为偶数时,该规则将引入偏向量的偏差,而当奇数为y时,该规则将引入朝向无穷大的偏差.此外,它通过增加相对于赔率的均匀概率来扭曲分布.