为何float/double的MinValue、MaxValue无法存入decimal类型?
为什么float/double的极值无法转换为decimal类型?
问题复现
代码示例:
float value = float.MinValue; decimal dec = (decimal) value;
运行时抛出异常:
Unhandled exception. System.OverflowException: Value was either too large or too small for a Decimal.
float.MinValue、float.MaxValue、double.MinValue、double.MaxValue都会触发该异常。明明float是32位、double是64位类型,decimal是128位类型,为何会出现溢出?
原因解析
核心在于decimal与float/double的存储机制完全不同,不能仅通过总位数判断数值容纳能力:
- float/double是二进制浮点类型:采用二进制科学计数法存储,能表示极大或极小的数值,但有效十进制位数有限(float约6-7位,double约15-17位)。比如
float.MaxValue约为3.40282347E+38,double.MaxValue更是达到1.7976931348623157E+308,数值量级极大。 - decimal是十进制浮点类型:存储结构为
符号位 + 96位整数 + 0~28的缩放因子,设计目的是保证高精度(最多28-29位十进制有效数字),而非追求超大数值范围。它能表示的最大绝对值仅为7.9228162514264337593543950335E+28,远小于float和double的极值,因此转换时会触发溢出异常。
内容的提问来源于stack exchange,提问作者Matthew Layton
相关产品推荐
相关产品推荐

