C#中double类型变量经Math.Round处理后为何输出3而非3.0?
问题描述
运行以下C#代码时,控制台输出结果为 System.Double, 3:
namespace NewApp { class Program { static void Main(string[] args) { double a = 1.0; double b = 2.7; a = Math.Round(b); Console.WriteLine(a.GetType() + ", " + a); } } }
存在的疑问:变量a声明为double类型,经Math.Round(b)赋值后,为什么输出显示的是"3",而非预期的"3.0"?
原因说明
- 核心逻辑:变量的实际类型、内存存储值,和它转成字符串后的展示效果没有绑定关系。从输出的
System.Double就能确认,a始终是双精度浮点数类型,内存里存储的值也确实是3.0,全程没有发生类型转换为整型的情况。 - 输出为
3是浮点数默认字符串格式化的规则导致的:Console.WriteLine直接传入double值时,会自动调用该类型的无参ToString()方法,.NET对浮点数的默认格式化逻辑会自动省略尾部无意义的0——只要浮点数的值是整数,默认转字符串就不会显示小数点和后面的小数位,不管这个值实际是3.0、3.00还是3.000000,默认输出都会是3。 - 验证方式:如果需要输出
3.0的效果,手动指定格式化规则即可,比如把输出语句修改为Console.WriteLine(a.GetType() + ", " + a.ToString("0.0"));,运行后就会得到System.Double, 3.0的输出。 - 补充:
Math.Round方法本身的返回值类型就是double,赋值给double类型的变量a时不存在隐式类型转换,不会把值先转成整数再存回double。
内容的提问来源于stack exchange,提问作者Никита Попов
相关产品推荐
相关产品推荐

