关于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 ...
随机推荐
- Java Jar包压缩、解压使用
什么是jar包JAR(Java Archive)是Java的归档文件,它是一种与平台无关的文件格式,它允许将许多文件组合成一个压缩文件. 如何打/解包使用jdk/bin/jar.exe工具,配置完环境 ...
- zabbix之监控 io
#:编写监控脚本 root@ubuntu:/etc/zabbix/zabbix_agentd.conf.d# vim iotop_total.sh #!/bin/bash #Date: 2016/11 ...
- maven常用命令(待补充)
1.mvn clean 删除已经编译好的信息 2.mvn compile 编译src/main/java目录下的.java文件 3.mvn test 编译src/main/java和src/test/ ...
- 用户信息查询系统_daoImpl
package com.hopetesting.dao.impl;import com.hopetesting.dao.UserDao;import com.hopetesting.domain.Us ...
- 使用RabbitMQ搭建MQTT服务
由于近期公司需要搭建一套物联网采集环境,底层设备采用MQTT协议传输数据.服务器环境为linux,考虑到现有环境已经有RabbitMQ环境,Rabbit是基于AMQP协议开发的一套高效的消息传输队列. ...
- Jenkins备份
目录 一.目录结构 二.插件备份 一.目录结构 Jenkins的所有数据都是存放在文件中的,所以,Jenins备份其实就是备份Jenkins_HOME目录. JENKINS_HOME目录的机构如下: ...
- .net 6 (.net core) 发布到linux docker中
第一步:VMware 安装 虚拟机Linux系统,本文以 CentOS 为例 .
- 深刨显式锁ReentrantLock原理及其与内置锁的区别,以及读写锁ReentrantReadWriteLock使用场景
13.显示锁 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile.Java5.0增加了一种新的机制:ReentrantLock.与之前提到过的机 ...
- MySQL 分区表,为什么分区键必须是主键的一部分?
随着业务的不断发展,数据库中的数据会越来越多,相应地,单表的数据量也会越到越大,大到一个临界值,单表的查询性能就会下降. 这个临界值,并不能一概而论,它与硬件能力.具体业务有关. 虽然在很多 MySQ ...
- SpringCloud (一) Eureka
Eureka Eureka 是一个服务治理组件,它主要包括服务注册和服务发现,主要用来搭建服务注册中心. Eureka 是一个基于 REST 的服务,用来定位服务,进行中间层服务器的负载均衡和故障转移 ...