关于C#的decimal浮点类型转化成字符串时末尾存在多个0
首先,对于浮点类型,double和float存在精度丢失问题,这一点在之前的一篇博文中有提到(C# double类型精度丢失问题),于是,一般时候推荐大家使用decmal,特别是涉及到一些金融计算时,double和float会让人崩溃的。
所谓鱼与熊掌不可兼得,decimal有更高的精度,不容易出现精度丢失问题,但是在序列化成字符串时可能会有意想不到的惊喜!
static void Main(string[] args) { decimal @decimal = 6.780000m; Console.WriteLine("decimal:" + @decimal.ToString()); double @double = 6.780000d; Console.WriteLine("double:" + @double.ToString()); float @float = 6.780000f; Console.WriteLine("float:" + @float.ToString()); Console.ReadKey(); }
上面的代码执行后
相同的数值,转化成字符串后decimal竟然多了一串0,在多数情况下,这是难以接受的,比如,在页面上展示时,这么多0很影响布局。
想要去掉这些多余的0,处理办法有很多,一般就是下面几种:
static void Main(string[] args) { decimal @decimal = 0m; Console.WriteLine("decimal:" + @decimal.ToString()); Console.WriteLine("decimal:" + @decimal.ToString("F2")); //四舍五入,保留2位小数 Console.WriteLine("decimal:" + decimal.Round(@decimal, 2)); //四舍五入,保留2位小数 Console.WriteLine("decimal:" + Math.Round(@decimal, 2)); //四舍五入,保留2位小数 Console.WriteLine("decimal:" + Convert.ToDouble(@decimal)); //转化成double类型在输出 Console.WriteLine("decimal:" + TrimZeroTail(@decimal)); //自定义方法实现 Console.ReadKey(); } public static string TrimZeroTail(decimal value) { var str = value.ToString(); if (str.EndsWith("0")) { str = str.TrimEnd('0', '.'); if (string.IsNullOrEmpty(str)) { return "0"; } while (decimal.Parse(str) != value) { str += "0"; } } return str; }
输出结果:
需要注意的是,前3中都是四舍五入(对中间数5的舍入方式不一样),这样就需要事先知道保留的小数位数,开发过程中一般都是2位,所以这三种做法是用的最多的。
第4种是先转换成double后在转化成字符串,这样的效果很好,但是不保证精度问题,毕竟double的小数位没有decimal多。
第5种就是我们自己写一个实现方法来进行转化,比如上面的TrimZeroTail方法,自己实现能满足我们大部分需求,但是实现不好可能会出现BUG。
再看例子:
static void Main(string[] args) { decimal @decimal = 6.000000m; Console.WriteLine("decimal:" + @decimal.ToString()); Console.WriteLine("decimal:" + @decimal.ToString("F2")); //四舍五入,保留2位小数 Console.WriteLine("decimal:" + decimal.Round(@decimal, 2)); //四舍五入,保留2位小数 Console.WriteLine("decimal:" + Math.Round(@decimal, 2)); //四舍五入,保留2位小数 Console.WriteLine("decimal:" + Convert.ToDouble(@decimal)); //转化成double类型在输出 Console.WriteLine("decimal:" + TrimZeroTail(@decimal)); //自定义方法实现 Console.ReadKey(); }
得到结果:
可以看到,前三种方式因为保留小数位的存在,因此无论什么样的数据都会保留小数位,比如上面的0,但是有时候我们希望这个0没有,这就需要使用第四种和第五种方式实现了。
总之,具体处理方式一定要根据自己的需求来决定,否则可能出现意想不到的结果!
一个专注于.NetCore的技术小白
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2019-10-16 C# 绘制印章