zoukankan      html  css  js  c++  java
  • Math.Round 四舍五入问题 解惑 !

    前言:

          一定要说 坑爹的微软! 坑爹的微软! 坑爹的微软!  重要的事情说 三遍 !

         

    摘录 SMDN

          示例

     

    下面的示例演示就近舍入。

     
    Math.Round(3.44, 1); //Returns 3.4.
    Math.Round(3.45, 1); //Returns 3.4.
    Math.Round(3.46, 1); //Returns 3.5.
    
    Math.Round(4.34, 1); // Returns 4.3
    Math.Round(4.35, 1); // Returns 4.4
    Math.Round(4.36, 1); // Returns 4.4

         MSDN 上显示  这就不是 四舍五入  这叫 五舍六入!

         重要的提示!  在  .NET 4.5 自后 该方法就成了标准的 四舍五入了!! 2.0 3.0 3.5 4.0 都是 五舍六入!

         
        解决办法 网上大神也给出过   

        摘录

      C#中小数点后保留两位小数,四舍五入的函数及使用方法

        2011-08-08 10:25 by 追忆似水流年, 14300 阅读, 2 评论, 收藏, 编辑

        Math.Round(45.367,2)     //Returns   45.37

        Math.Round(45.365,2)     //Returns   45.36

         C#中的Round()不是我们中国人理解的四舍五入,是老外的四舍五入,是符合IEEE标准的四舍五入,具体是四舍六入,下面的才是符合中国人理解的四舍五入

          Math.Round(45.367,2,MidpointRounding.AwayFromZero);//45.37

        Math.Round(45.365,2,MidpointRounding.AwayFromZero)     //Returns   45.37         

            这个是非得想 使用 该方法   的解决方法     但是!!!  有BUG !!  输入 1.015   得到的结果是 1.01      !!!!  其他的没问题。

        

           最终我建议不使用 这个方法  直接使用   ToString("F3")   Fn  n是几 就截取几位小数并且四舍五入!

    此文章由人工翻译。 将光标移到文章的句子上,以查看原文。
    译文
    原文

    Math.Round 方法 (Decimal, Int32)

    .NET Framework 4
     
    其他版本
     

     

    将小数值按指定的小数位数舍入。

     

    命名空间:  System
    程序集:  mscorlib(在 mscorlib.dll 中)
    语法
     
     
    public static decimal Round(
    	decimal d,
    	int decimals
    )
    

    参数

    d
    类型:System.Decimal
    要舍入的小数。
    decimals
    类型:System.Int32
    返回值中的小数位数。

    返回值

    类型:System.Decimal
    最接近 d 的 decimals 位小数的数字。
    异常
     
    异常条件
    ArgumentOutOfRangeException

    decimals 小于 0 或大于 28。

    OverflowException

    结果超出了 Decimal 的范围。

    备注
     

    decimals 参数指定返回值中的小数位数以及范围 0 和 28。 如果 decimals 等于零,则返回整数。

    如果 d 中 decimals 小数位置右侧的第一位数字的值为 5,则 decimals 位置中的数字向上舍入(如果为奇数)或不变(如果为偶数)。 如果 d 的精度小于 decimals,则返回 d 而不做更改。

    此方法的行为遵循 IEEE 标准 754 的第 4 节。 这种舍入有时称为就近舍入或四舍六入五成双。 它可以将因单方向持续舍入中点值而导致的舍入误差降到最低。

    若要控制 Round(Decimal, Int32) 方法使用的舍入类型,请调用 Decimal.Round(Decimal, Int32, MidpointRounding) 重载。

    示例
     

    下面的示例演示就近舍入。

     
    Math.Round(3.44, 1); //Returns 3.4.
    Math.Round(3.45, 1); //Returns 3.4.
    Math.Round(3.46, 1); //Returns 3.5.
    
    Math.Round(4.34, 1); // Returns 4.3
    Math.Round(4.35, 1); // Returns 4.4
    Math.Round(4.36, 1); // Returns 4.4
    

     

  • 相关阅读:
    javascript中的预编译问题
    五环
    两列布局
    定位以及z-index
    [vijos1234]口袋的天空<最小生成树>
    [讲解]prim算法<最小生成树>
    [noip模拟]B<构造>
    [JZOJ5343]健美猫<模拟>
    [noip模拟]心<并查集>
    [noip模拟]种花<快速幂+结论>
  • 原文地址:https://www.cnblogs.com/atliwen/p/5455816.html
Copyright © 2011-2022 走看看