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

将双精度舍入到特定的小数位数-Math.Round vs Convert.ToDouble(ToString())

  •  0
  • Richard  · 技术社区  · 7 年前

    针对四舍五入(用于报告)问题提出的修复方案如下:

    private double RoundedResult(double v, int digits) 
    {
        // return Math.Round(value, digits); 
        // sometimes does not do proper rounding per user feedback
    
        // proposed fix relies on a fixed decimal (F) format rendering converted back to double
        return
          Convert.ToDouble
          (
              v.ToString("F"+digits);
          );
    }
    

    我不确定F的变幻莫测 总体安排

    出身背景

    单个报告将包含<1000个四舍五入的数字,所以我不担心性能。

    double? 报告时需要将数值四舍五入到不同的小数位数。我知道系统应该使用十进制数据值,而不是double,但我仍然坚持使用传统的double。

    文本数据文件显示0.000065,数据库查看器显示0.000065,报告(小数点后5位)显示0.00006,而不是0.00007。报告应始终汇总。

    文本文件信息是

    我正在研究这个项目的细节

    double? value = 0.000065;
    

    我知道 0.000065d 实际上必须比 0.000065m

    • Math.Round(value.Value,5,...) 返回 0.00006 ,同时使用 MidpointRounding.AwayFromZero ToEven .
    • 0.000065d-0.000065f -1.7695129487117073E-13 double
    • 调试器监视显示,值的单次强制转换将向上取整
      • Math.Round((Single)value,5) 7E-05 double

    略显困惑

    • value.Value.ToString("F5") 返回 "0.00007"

    我不知道 F5 ToString() (又名 String.Format() )有某种魔力。

    将双精度0.000065的单个铸件四舍五入的单个案例通过产生0.0007“起作用”,但可能不会在所有情况下都起作用。

    小提琴代码

    我写了一封信 .NET Fiddle 在大量“以5结尾”的情况下进行迭代,ToString(“F5”)似乎总是产生“人类期望的”结果。

    0 回复  |  直到 7 年前
    推荐文章