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# 四舍五入的主要内容,如果未能解决你的问题,请参考以下文章