首先,对于浮点类型,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的更多相关文章

  1. js把其他类型转化成字符串

    js把其他类型转化成字符串 一.总结 一句话总结:类型转换中的强制类型转换分为类型转换函数和类型名强制.js后一种和其它语言不同,是类型类的构造方法.String() 二.js把其他类型转化成字符串 ...

  2. 将数据转化成字符串时:用字符串的链接 还是 StringBuilder

    /* 目的:将数据转化成字符串时:用字符串的链接 还是 StringBuilder呢? */ public class Test{ public static void main(String[] a ...

  3. .net core json序列化 long类型转化成字符串

    实现类 using System; using System.ComponentModel; using System.Linq; using Newtonsoft.Json; namespace H ...

  4. C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现

      在C#中大家都会遇到这种情况 double类型的数据,需要格式化(保留N未有效数字)或者是保留N为小数等情况,我们往往采取double.tostring("参数");的方法.下 ...

  5. js中对象转化成字符串、数字或布尔值的转化规则

    js中对象可以转化成 字符串.数字.布尔值 一.对象转化成字符串: 规则: 1.如果对象有toString方法,则调用该方法,并返回相应的结果:(代码通常会执行到这,因为在所有对象中都有toStrin ...

  6. Android--将Bitmip转化成字符串

    因为自己做的东西想要上传到服务器,所以就选择了将Bitmip转化成了字符串在上传 其它格式的图片我们好像可以用Bitmap.Factory 去将他们转化成BitMap 转化成字符串的代码 //将bit ...

  7. laravel 将数组转化成字符串 再把字符串转化成数组

    这是在给阮少翔改代码的时候用的方法, 开始的数据用explored转化成数组不是想要的结果, 我就自己写了一个方法把有用的信息提取出来拼接成一个字符串, 再用explored将字符串转化成数组.   ...

  8. Date、Time类型拼接成字符串

    Date.Time类型拼接成字符串 语言用的是kotlin,和Java类似 var time = "" val sdf1 = SimpleDateFormat("yyyy ...

  9. fastjson中对象转化为字符串时过滤某字段

    fastjson中对象转化为字符串时过滤某字段,有两种方法: 一.在该字符定义上方添加"@JSONField(serialize=false)"注解: 二.调用含有Property ...

随机推荐

  1. JDBC(2):JDBC对数据库进行CRUD

    一. statement对象 JDBC程序中的Connection用于代表数据库的链接:Statement对象用于向数据库发送SQL语句:ResultSet用于代表Sql语句的执行结果 JDBC中的s ...

  2. 【Linux】【Basis】【RHEL】KickStart for RHEL6.8

    1. 概念: 自动安装的脚本,这篇文章以RHEL6.8为例 kickstart for RHEL6.8官方教程:https://access.redhat.com/documentation/en-U ...

  3. springMVC WebApplicationInitializer 替代web.xml 配置Servlet 之原理

    Servlet 3.0之前 ,xml  配置 在过去搭建spring + springMCV ,首先第一步要做的是什么 ,就是要配置web.xml 文件 ,把springMVC 中的Servlet 加 ...

  4. [BUUCTF]PWN——pwnable_hacknote

    pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方 ...

  5. Table.SplitColumn拆分…Split…(Power Query 之 M 语言)

    数据源: 一列若干行数据. 目标: 根据特定条件拆分 操作过程: 选取"品名"列>[主页](或[转换])>[拆分列] 选取"品名"列>[主页] ...

  6. .NET静态代码织入——肉夹馍(Rougamo)

    肉夹馍是什么 肉夹馍通过静态代码织入方式实现AOP的组件..NET常用的AOP有Castle DynamicProxy.AspectCore等,以上两种AOP组件都是通过运行时生成一个代理类执行AOP ...

  7. linux查看磁盘SN

    ls -l /dev/disk/by-id/ | grep -iE   <SN>

  8. python dumps和loads

    dumps和loads的使用 import json dict = {'姓名': 'supermao','年龄': '19','爱好': '未知', '地区': '武汉'} string=json.d ...

  9. React使用css module和className多类名设置

    引入样式文件 import styles from './footer.module.css'; 注意: 样式文件名必须要以.module.css结尾 单类名设置 <div className= ...

  10. flutter 学习笔记

    常用属性 container 填充padding,边距margins,边框borders,背景色color, decoration: 渐变gradient-Alignment(x,y),圆角borde ...