将double舍入到小数位数后的位数-Math.Round与Convert.ToDouble(ToString())

时间:2018-09-08 15:07:08

标签: c# rounding

针对四舍五入(用于报告)问题的建议修复方法是

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 n 格式的变化。

问题:以上内容是否合理? ,以后还会引起其他问题吗?

背景

单个报告将具有<1,000个四舍五入的数字,因此我不必担心效果。

我正在使用SQL Server和ASP NET MVC应用程序代码处理遗留系统。数据值为double?,并且需要四舍五入为不同的小数位数以进行报告。我知道系统应该使用十进制数据值而不是双精度数,但是我仍然使用传统的双精度数。

最终用户抱怨这种特殊情况(和其他类似情况):

  

文本数据文件具有0.000065,数据库查看器显示0.000065,报告(至5个小数位)显示0.00006,而不是0.00007。报告应始终四舍五入。

文本文件信息为

我正在研究

的细节
double? value = 0.000065;

我知道0.000065d实际上必须比0.000065m稍小一些:

  • Math.Round(value.Value,5,...)使用0.00006MidpointRounding.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())正在运行某种Mojo。

将双0.000065的单个转换四舍五入的单个情况通过产生0.0007来“起作用”,但可能并非在所有情况下都如此。

小提琴代码

我写了.NET Fiddle来遍历大量的“以5结尾”的情况,看来ToString(“ F5”)总是产生“人类期望的”结果。

0 个答案:

没有答案