【发布时间】:2013-12-16 23:54:07
【问题描述】:
我有一个double,小数点后有 17 位数字,即:
double myDouble = 0.12345678901234567;
如果我像这样将其转换为decimal:
decimal myDecimal = Convert.ToDecimal(myDouble);
然后根据Convert.ToDecimal 文档将myDecimal 的值四舍五入为15 位(即0.0123456789012345)。我的问题是,为什么要进行这种舍入?
我知道,如果我的原始数字可以准确地以 10 为基数表示,并且我试图将其存储为 double,那么我们只能对前 15 位数字有信心。最后两位数可能会出现舍入误差。但是,这是一个以 10 为基数的偏见观点。我的号码可能更准确地表示为 double,我希望将其转换为 decimal,同时尽可能保持准确。
Convert.ToDecimal 不应该旨在最小化myDouble 和(double)Convert.ToDecimal(myDouble) 之间的差异吗?
【问题讨论】:
-
也许是为了和
double.ToString+decimal.Parse保持一致 -
如果您对创建“可往返”十进制值感兴趣,请查看stackoverflow.com/questions/6840681/…。
-
您正在进行测量,其中精确到 一万亿 中的一个部分是相关的?你在这里运行大型强子对撞机吗?这是一个小到不值得强调的数量。无论你在这个双精度中表示的任何测量值的误差条,都可能比舍入误差大几百万倍。
-
@EricLippert 我从 C 接口后面的 SDK 获得最大值和最小值(因此
double)。我的系统在内部将这些存储为decimals。当我尝试在 SDK 中设置这些值时,它们需要在 max-min 范围内。我并没有强调准确性,但这并不能阻止 SDK 返回超出范围。