关于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 ...
随机推荐
- vue-cli4脚手架搭建二
vue-cli4脚手架搭建一 vue create vue3 cd vue3 yarn serve http://localhost:8080/#/ main.js文件 import Vue from ...
- ubantu安装maven
下载地址 http://maven.apache.org/download.cgi 或直接命令行下载 wget https://downloads.apache.org/maven/maven-3/3 ...
- java 动态代理—— Mybaties 拦截器链基本原理实现
1.摘要 Mybaties 中有个分页插件,之前有特意的去了解了一下原理 :https://www.cnblogs.com/jonrain0625/p/11168247.html,从了解中得知分页插件 ...
- 【C/C++】学生排队吃饭问题
问题: 有n个学生,学生们都在排队取餐,第个学生在L国时刻来到队尾,同一时刻来的学生编号小的在前,每个时刻当队列不为空时,排在队头的同学就可以拿到今天的中餐并离开队伍,若第个学生R团时刻不能拿到中餐, ...
- 【C++】最长回文子串/动态规划
ACM #include <bits/stdc++.h> using namespace std; const int maxn = 1010; char S[maxn]; int dp[ ...
- 记一次单机Nginx调优,效果立竿见影
一.物理环境 1.系统是Centos 8,系统配置 2核4G,8M带宽,一台很轻的应用服务器. 2.站点部署情况.但站点部署两个实例,占用两个端口,使用nginx 负载转发到这两个web站点. 二. ...
- 图形学之Unity渲染管线流程
Unity中的渲染管线流程 下图是<Unity Shader 入门精要>一书中的渲染流程图: ApplicationStage阶段:准备场景信息(视景体,摄像机参数).粗粒度剔除.定义每个 ...
- Gitlab用户在组中有五种权限
Gitlab用户在组中有五种权限:Guest.Reporter.Developer.Master.Owner Guest:可以创建issue.发表评论,不能读写版本库 Reporter:可以克隆代码, ...
- Nginx HTTP块配置
1 配置块的嵌套 http { upstream {...} split_clients {...} map {...} geo {...} server { if () {...} location ...
- SimpleCursorAdapter 原理和实例
SimpleCursorAdapter 1. 原理参见下面代码注释 Cursor cursor = dbHelper.fetchAllCountries(); //cursor中存储需要加载到list ...