针对四舍五入(用于报告)问题提出的修复方案如下:
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”)似乎总是产生“人类期望的”结果。