为什么Convert.ToDecimal(Double)轮到15位有效数字?

eoi*_*lan 3 c# double decimal

我有一个double小数点后的17位数,即:

double myDouble = 0.12345678901234567;
Run Code Online (Sandbox Code Playgroud)

如果我把它转换成decimal这样的:

decimal myDecimal = Convert.ToDecimal(myDouble);
Run Code Online (Sandbox Code Playgroud)

然后根据文档将值myDecimal四舍五入为Convert.ToDecimal15位数(即0.0123456789012345).我的问题是,为什么要进行这种舍入?

我明白,如果我的原始数字可以准确地表示在基数10中并且我试图将其存储为a double,那么我们只能对前15位数有信心.最后两位数将受到舍入误差的影响.但是,这是一个基础10偏见的观点.我的数字可以用a更准确地表示double,我希望将其转换decimal为尽可能保持尽可能准确的数字.

不应Convert.ToDecimal旨在尽量减少之间的区别myDouble(double)Convert.ToDecimal(myDouble)

stu*_*rtd 6

Double文档:

Double值最多包含15个十进制数字的精度,但内部最多保留17位数

因此,由于double值本身最多有15个小数位,将其转换为Decimal将导致Decimal值具有15位有效数字.

  • "double"的不同值在以十进制形式呈现时具有不同数量的有效数字,这取决于它们是刚刚超过或仅仅在10的幂之下,并且刚刚超过或仅在2的幂下.例如,在1000-1023.9范围内的值由1.137E-12分隔,而在8192至9999.9范围内的值由1.819E-11分隔; 因此,即使它们具有(十进制)相同的数量级,在这些范围内的值的相对精度也存在超过十进制数值的差异. (2认同)