关于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没有,这就需要使用第四种和第五种方式实现了。
总之,具体处理方式一定要根据自己的需求来决定,否则可能出现意想不到的结果!
关于C#的decimal浮点类型转化成字符串时末尾存在多个0的更多相关文章
- js把其他类型转化成字符串
js把其他类型转化成字符串 一.总结 一句话总结:类型转换中的强制类型转换分为类型转换函数和类型名强制.js后一种和其它语言不同,是类型类的构造方法.String() 二.js把其他类型转化成字符串 ...
- 将数据转化成字符串时:用字符串的链接 还是 StringBuilder
/* 目的:将数据转化成字符串时:用字符串的链接 还是 StringBuilder呢? */ public class Test{ public static void main(String[] a ...
- .net core json序列化 long类型转化成字符串
实现类 using System; using System.ComponentModel; using System.Linq; using Newtonsoft.Json; namespace H ...
- C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现
在C#中大家都会遇到这种情况 double类型的数据,需要格式化(保留N未有效数字)或者是保留N为小数等情况,我们往往采取double.tostring("参数");的方法.下 ...
- js中对象转化成字符串、数字或布尔值的转化规则
js中对象可以转化成 字符串.数字.布尔值 一.对象转化成字符串: 规则: 1.如果对象有toString方法,则调用该方法,并返回相应的结果:(代码通常会执行到这,因为在所有对象中都有toStrin ...
- Android--将Bitmip转化成字符串
因为自己做的东西想要上传到服务器,所以就选择了将Bitmip转化成了字符串在上传 其它格式的图片我们好像可以用Bitmap.Factory 去将他们转化成BitMap 转化成字符串的代码 //将bit ...
- laravel 将数组转化成字符串 再把字符串转化成数组
这是在给阮少翔改代码的时候用的方法, 开始的数据用explored转化成数组不是想要的结果, 我就自己写了一个方法把有用的信息提取出来拼接成一个字符串, 再用explored将字符串转化成数组. ...
- Date、Time类型拼接成字符串
Date.Time类型拼接成字符串 语言用的是kotlin,和Java类似 var time = "" val sdf1 = SimpleDateFormat("yyyy ...
- fastjson中对象转化为字符串时过滤某字段
fastjson中对象转化为字符串时过滤某字段,有两种方法: 一.在该字符定义上方添加"@JSONField(serialize=false)"注解: 二.调用含有Property ...
随机推荐
- mysql 索引 零记
索引算法 二分查找法/折半查找法 伪算法 : 1. 前提,数据需要有序 2. 确定数据中间元素 K 3. 比如目标元素 A与K的大小 3.1 相等则找到 3.2 小于时在左区间 3.3 大于时在右 ...
- 在调用系统相册时,UIIMagePickerController使用中偷换StatusBar颜色的问题
在调用系统相册时,UIIMagePickerController使用中偷换StatusBar颜色的问题 此时解决办法是 #pragma mark - UIImagePickerController D ...
- easyhadoop 安装
ldconfig deferred processing now taking place正在处理用于 libapache2-mod-php5 的触发器... * Reloading web serv ...
- "delete this" in C++
Ideally delete operator should not be used for this pointer. However, if used, then following points ...
- Dubbo管控平台
2019年初,官方发布了Dubbo管理控制台0.1版本.结构上采取了前后端分离的方式,前端使用Vue和Vuetify分别作为Javascript框架和UI框架,后端采用Spring Boot框架 一. ...
- 【Linux】【Services】【NetFileSystem】Samba
1. 简介 1.1. 背景:case is initiative by 某windows无良人事,需求是需要一整块4T的硬盘,由于ESXi5最大支持一块盘是2T大小,而且不可以使用windows动态卷 ...
- Centos 7 安装redis,修改配置文件不生效、外网不能访问。
前提: 在用Centos 7 安装 redis 时,遇上一下几个问题 ,记录下 . 1.修改配置文件,按官网步骤启动,不生效. 2.外网无法访问redis. 步骤: 1.打开centos 虚拟机 ,按 ...
- 【力扣】123. 买卖股票的最佳时机 III
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的 ...
- 使用NTP原理进行时间同步
在一些物联网企业,平台会和嵌入式一起配合进行工作. 有时平台会希望嵌入式这边不使用现成的NTP方案自己去同步时间,而希望以平台下发的时间为准. 此时就有两个方案. 方案1. 平台下发一个时间戳tim ...
- 权限设计的idea
1.角色增加两个字段,一级部门(如钻井事业部),党组织角色(或者团委在线角色)当然或者是其他的团委在线角色 2.增加一张表,标示在线模块(如党组织在线,团委在线,工会在线,纪检在线), 3.菜单(栏目 ...