将浮点数转换为十进制,为什么需要显式转换?

Convert float to decimal, why need explicit conversion?

提问人:Jerry 提问时间:10/25/2022 最后编辑:ProgrammingLlamaJerry 更新时间:10/25/2022 访问量:328

问:

我知道 decimal 类型比 float 更精确,所以我认为将 float 转换为 decimal 就像将 float 转换为 double 一样是合理的。但在现实中,事实并非如此。

float a = 1.1f;
double d = a;

decimal c = (decimal)d; // true
decimal e = (decimal)a; // true

decimal f = a; // error
C# 浮点 类型转换 十进制

评论

1赞 ProgrammingLlama 10/25/2022
请查看在本网站上发帖的指南。您不应该在问题标题中放置标签(例如),因为该网站已经有合适的标签系统。[C#]

答:

4赞 Matthew Watson 10/25/2022 #1
  • A 的近似范围为 ±1.5 x 10−45 到 ±3.4 x 1038,精度为 6-9 位。float
  • A 的近似范围为 ±1.0 x 10-28 到 ±7.9228 x 10 28,精度为28-29 位。decimal

如果 超出小数的范围,则将 a 分配给 a 将导致异常。floatdecimalfloat

因此,如果您尝试在不强制转换的情况下执行此操作,则会出现编译错误。在这些情况下,C# 会谨慎行事。

在这里,我们可以看到范围精度之间的区别。

A 的范围比 a 大,a 的精度比 a 高。floatdecimaldecimalfloat

(请注意,如果您尝试在不强制转换的情况下将 a 分配给 a,您也会遇到编译错误,但这次是因为它可能会丢失数据,而不是因为它会引发异常。decimalfloat

评论

2赞 Evk 10/25/2022
它(尝试将超出范围的浮点数转换为十进制)实际上不会导致数据丢失,而是导致异常。