针对四舍五入(用于报告)问题的建议修复方法是
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.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()
)正在运行某种Mojo。
将双0.000065的单个转换四舍五入的单个情况通过产生0.0007来“起作用”,但可能并非在所有情况下都如此。
小提琴代码
我写了.NET Fiddle来遍历大量的“以5结尾”的情况,看来ToString(“ F5”)总是产生“人类期望的”结果。