【问题标题】:Javascript and C# rounding hellJavascript 和 C# 四舍五入
【发布时间】: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 舍入以确保它们都舍入到相同的值?

【问题讨论】:

    标签: javascript c# kendo-ui


    【解决方案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 为奇数时,将引入趋向无穷大的偏差。此外,它通过增加偶数相对于赔率的概率来扭曲分布。

    【讨论】:

    • 谢谢,明白了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多