C#中使用double类型计算结果为何不为0?
为什么C#中double类型计算结果不为0,decimal却为0?
你的代码里用double类型计算(_v1 - _v2) - _v3时结果不为0,核心原因是double和decimal的存储机制完全不同:
- double是二进制浮点数:它用二进制编码表示数值,但大部分十进制小数(比如你代码里的0.08、0.17、0.91)无法被二进制精确表示,只能存储为近似值。当这些近似值参与减法运算时,微小的误差会累积,最终得到一个极小的非零值(比如
1.4210854715202004e-14这类量级的数),而非预期的0。 - decimal是十进制浮点数:它专门针对十进制小数设计,存储的是十进制数字和缩放因子,能精确表示像0.08、0.17这类常见的十进制小数。用decimal运算时,所有数值都是精确存储的,减法后自然得到精确的0。
验证decimal版本的代码,结果确实会是0:
decimal _v1 = 1687.08m; decimal _v2 = 175.17m; decimal _v3 = 1511.91m; decimal _answer = (_v1 - _v2) - _v3; Console.WriteLine($"{((_v1 - _v2) - _v3)}"); Console.WriteLine($"{_answer}");
内容的提问来源于stack exchange,提问作者Ron Bowes II
相关产品推荐
相关产品推荐

