Javascript 和 C# 四舍五入

Posted

技术标签:

【中文标题】Javascript 和 C# 四舍五入【英文标题】:Javascript and C# rounding hell 【发布时间】:2017-11-26 17:36:18 【问题描述】:

如您所知,由于 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

现在在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"

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

【问题讨论】:

【参考方案1】:

有一个overload in C#´s Math.Round 接受一个指标来确定当数字在其他两个数字之间时如何舍入。例如。 MidPointToEven 将 0.5 舍入为零,因为 0 是最近的偶数:

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

根据默认使用MidPointToEven,您的数字将始终四舍五入到最接近的偶数数。因此,您会得到这些结果:

2.155 --> 2.16
2.145 --> 2.14

【讨论】:

错过了那个。谢谢!实际上我的问题完全在 Javascript 方面,我将创建一个新问题。【参考方案2】:

您可以指定要在 C# 中使用的 midpoint rounding 规则:

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

小数的默认值为MidpointRounding.ToEven AKA banker's rounding,它旨在最大限度地减少多次舍入操作的偏差。

round half to even 方法对称地处理正负值,因此没有符号偏差。更重要的是,对于 y 值的合理分布,四舍五入的数字的平均值与原始数字的平均值相同。然而,当 y - 0.5 为偶数时,此规则将引入趋向零的偏差,而当 y-0.5 为奇数时,将引入趋向无穷大的偏差。此外,它通过增加偶数相对于赔率的概率来扭曲分布。

【讨论】:

谢谢,明白了!

以上是关于Javascript 和 C# 四舍五入的主要内容,如果未能解决你的问题,请参考以下文章

C#和sql 中的 四舍五入向下向上取整

js四舍五入不显示.00

小数(decimal,double) 截取两位或多位,不四舍五入

C#中Math.Round()实现中国式四舍五入

C#怎么保留小数后面2个小数 又怎么四舍五入保留2个小数

Javascript 分离和裁剪以及四舍五入