代码之家  ›  专栏  ›  技术社区  ›  glexey

c#与python浮点舍入差异

  •  0
  • glexey  · 技术社区  · 6 年前

    我正在用python开发一个应用程序,其中一些部分是用c#编写的(为了提高速度),我很困惑为什么在使用“round”函数和字符串浮点格式函数时,c#浮点舍入的行为与python的行为有点“相反”,下面是一个示例:

    >>> round(6.25, 1)
    6.3
    >>> "%.1f"%6.25
    6.2
    

    C#

    >>> Math.Round(6.25,1)
    6.2
    >>> (6.25).ToString("F1")
    6.3
    

    有人知道为什么Python和c之间的行为看起来是“颠倒”的吗?有没有办法将“双精度”浮点值四舍五入到N个十进制数字,从而在Python和C#之间生成保证相同的字符串输出?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Wai Ha Lee captain-yossarian from Ukraine    6 年前

    蟒蛇的 round(number[, ndigits])

    返回四舍五入为的浮点值 ndigits NDIGIT 如果省略,则默认为零。结果是一个浮点数。值四舍五入到最接近幂减的10倍 NDIGIT ; 如果两个倍数相等接近,则舍入时应远离 0 (例如, round(0.5) 1.0 round(-0.5) -1.0

    C#s Math.Round(double, int)

    将双精度浮点值舍入到指定的小数位数,并将中点值舍入到最接近的偶数。

    • Python从零开始舍入( 6.25 6.3 因为 6.3 0 6.2 )
    • C#四舍五入到最近的偶数,因此 6.25 因为 6.2 是最近的偶数。

    Math.Round 这需要一段时间 MidpointRounding enum value Round(double, int, MidpointRounding) ,例如:

    Math.Round(6.25, 1,  MidpointRounding.AwayFromZero);
    

    它将做与Python舍入相同的事情。

        2
  •  2
  •   ycx    6 年前

    Banker's Rounding .
    这是一个有目的的实施细节。

    import decimal
    #The rounding you are looking for
    decimal.Decimal('3.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_UP)
    >>> Decimal('4')
    decimal.Decimal('2.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_UP)
    >>> Decimal('3')
    
    
    #Other kinds of rounding
    decimal.Decimal('2.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_EVEN)
    >>> Decimal('2')
    
    decimal.Decimal('3.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_DOWN)
    >>> Decimal('3')
    
        3
  •  2
  •   N.D.C.    6 年前

    Math.Round 默认情况下使用银行舍入,舍入到最接近的偶数值(例如。 Math.Round(6.25,1) -&燃气轮机;6.2,如你所见,以及 Math.Round(6.35,1) Math.Round(6.25, 1, MidpointRounding.AwayFromZero) .

    至于另一个问题,double.ToString()会导致舍入。提到 C# Double - ToString() formatting with two decimal places but no rounding