C#中Decimal类型截取保留N位小数并且不进行四舍五入操作

一、问题描述

开发中,需要使Decimal类型数据保留小数点后的两位小数且不需要进行四舍五入操作,即直接截取小数点后面的两位小数即可。例如:1.245M --> 1.24,而不是1.25

使用Decimal.Round()方法可以实现保留Decimal类型数据小数点后的若干位小数,但是该方法会进行四舍五入操作,而不是直接截取。所以,该方法不可取,在网上搜寻一番也没有找到合适的方法,便自己实现了一个截取Decimal类型数据小数点后若干位的方法。

二、详细的实现代码

using System;
namespace CutDecimal
{
  public static class DecimalHelper
  {
    public static decimal CutDecimalWithN(decimal d, int n)
    {
      string strDecimal = d.ToString();
      int index = strDecimal.IndexOf(".");
      if (index == -1 || strDecimal.Length < index + n + 1)
      {
        strDecimal = string.Format("{0:F" + n + "}", d);
      }
      else
      {
        int length = index;
        if(n != 0)
        {
          length = index + n + 1;
        }
        strDecimal = strDecimal.Substring(0, length);
      }
      return Decimal.Parse(strDecimal);
    }
  }
}

三、测试代码及结果

static void Main(string[] args)
{
  decimal d = 1.23456789M;
  for (int i = 0; i <= 10; i++)
  {
    Console.WriteLine("{0}", DecimalHelper.CutDecimalWithN(d, i));
  }
  for (int i = 0; i <= 10; i++)
  {
    Console.WriteLine("{0}", Decimal.Round(d, i));
  }
}

测试代码中,不仅给出了本文实现方法的测试代码,还给出了Decimal.Round()方法的测试代码,最终的运行效果如下图所示。

图1 运行结果

大伙儿,能看出区别吧?

(0)

相关推荐

  • C#中计算时间差中的小数问题解决

    问题: startTime = DateTime.Now;            -----------slExecutedTime.Text = (DateTime.Now - startTime).ToString();执行结果:已执行:00:00:03.1234434(后面会多出很多的小数位)想要的执行结果:已执行:00:00:03 -------------------------------------------------------------------------------

  • C#小数点格式化用法小结

    本文实例讲述了C#小数点格式化用法.分享给大家供大家参考,具体如下: 1.ToString()方法 double d=12345678.2334; Console.WriteLine(d.ToString("F2")); //1234.23 Console.WriteLine(d.ToString("###,###.00")); //12,345,678.23 2.Math.Round()方法 Math.Round(3.44, 1); //Returns 3.4.

  • c#匹配整数和小数的正则表达式

    匹配整数的一种表达式: Regex.IsMatch(inputerstr, "^([0-9]{1,})$") 其中Inputerstr是要匹配的字符串 这个表达式仅匹配整数,如果是整数形式返回true,否则为false 匹配小数格式的表达式: Regex.IsMatch(inputerstr, "^([0-9]{1,}[.][0-9]*)$") 其中Inputerstr是要匹配的字符串 这个表达式仅匹配数字中有小数点格式的数字,如果是带有小数点格式的纯数字,返回tr

  • .net decimal保留指定的小数位数(不四舍五入)

    前言 项目中遇到分摊金额的情况,最后一条的金额=总金额-已经分摊金额的和. 这样可能导致最后一条分摊的时候是负数,所以自己写了一个保留指定位数小数的方法. 扩展方法的使用,使得调用起来很优雅. 示例代码 public static class DecimalExtension { /// <summary> /// decimal保留指定位数小数 /// </summary> /// <param name="num">原始数量</param&

  • C#实现百分比转小数的方法

    本文实例讲述了C#实现百分比转小数的方法.分享给大家供大家参考.具体分析如下: 近日需要用到百分比转小数功能,而且百分比是字符串格式(可以带或不带百分号). 如果是小数转百分比那就简单了,C#里数字格式字符串有个 p . 但是百分比转小数还真不知道有没有?简单看了一下MSDN,没有发现(眼花?). 因此,直接搞了一个方法来实现: /// <summary> /// 将百分比转换成小数 /// </summary> /// <param name="perc"

  • 数据库 数据类型float到C#类型decimal, float数据类型转化无效

    今天运行系统突然出错,数据类型转化无效,错误在system.data.sqlclient.get_decimal()方法,初步估计是数据库的float类型转换为c#的decimal类型时出错了,实体类使用的是decimal?类型,心想就算数据库里的数值是空,也不能出现转换错误啊. 网上百般搜索,很多人遇到类似情况,多数是直接去float类型时候出错,如(float)dr[0],后来看到有说应该是先转化成double,然后在转化成float就可以了 尝试了一下把实体类的decimal?类型的字段改

  • C# 小数位数保留的方法集锦

    1.System.Globalization.NumberFormatInfo provider = new System.Globalization.NumberFormatInfo(); provider.NumberDecimalDigits =intDecLength; //要设定的小数位数 double strCashAmt=Convert.ToDouble(this.txtCashAmt.Text); //先把控件內的值转成double this.txtCashAmt.Text =

  • C# double和decimal数据类型以截断的方式保留指定的小数位数

    项目中要用到以截断的方式取小数点后两位,故写了以下方法: 复制代码 代码如下: /// <summary> /// 将小数值按指定的小数位数截断 /// </summary> /// <param name="d">要截断的小数</param> /// <param name="s">小数位数,s大于等于0,小于等于28</param> /// <returns></retur

  • C#中Decimal类型截取保留N位小数并且不进行四舍五入操作

    一.问题描述 开发中,需要使Decimal类型数据保留小数点后的两位小数且不需要进行四舍五入操作,即直接截取小数点后面的两位小数即可.例如:1.245M --> 1.24,而不是1.25 使用Decimal.Round()方法可以实现保留Decimal类型数据小数点后的若干位小数,但是该方法会进行四舍五入操作,而不是直接截取.所以,该方法不可取,在网上搜寻一番也没有找到合适的方法,便自己实现了一个截取Decimal类型数据小数点后若干位的方法. 二.详细的实现代码 using System; n

  • js保留两位小数方法总结

    本文是小编针对js保留两位小数这个大家经常遇到的经典问题整理了在各种情况下的函数写法以及遇到问题的分析,以下是全部内容: 一.我们首先从经典的"四舍五入"算法讲起 1.四舍五入的情况 var num =2.446242342; num = num.toFixed(2); // 输出结果为 2.45 2.不四舍五入 第一种,先把小数边整数: Math.floor(15.7784514000 * 100) / 100 // 输出结果为 15.77 第二种,当作字符串,使用正则匹配: Num

  • MySQL中decimal类型用法的简单介绍

    MySQL中支持浮点数的类型有FLOAT.DOUBLE和DECIMAL类型,DECIMAL 类型不同于FLOAT和DOUBLE,DECIMAL 实际是以串存放的.DECIMAL 可能的最大取值范围与DOUBLE 一样,但是其有效的取值范围由M 和D 的值决定.如果改变M 而固定D,则其取值范围将随M 的变大而变大. 对于精度比较高的东西,比如money,建议使用decimal类型,不要考虑float,double, 因为他们容易产生误差,numeric和decimal同义,numeric将自动转

  • 深入讲解数据库中Decimal类型的使用以及实现方法

    目录 1 背景 2 Decimal类型的使用 2.1 描述Decimal 2.2 建表时定义Decimal 2.3 写入decimal数据 2.4 取出deimcal进行计算 3 Decimal类型的实现 3.1 MySQL 3.2 ClickHouse 3.3 总结 4. MySQL 违反直觉的地方 总结 1 背景 数字运算在数据库中是很常见的需求, 例如计算数量.重量.价格等, 为了满足各种需求, 数据库系统通常支持精准的数字类型和近似的数字类型. 精准的数字类型包含 int, decima

  • JavaScript中判断为整数的多种方式及保留两位小数的方法

    一.使用取余运算符判断 任何整数都会被1整除,即余数是0.利用这个规则来判断是否是整数. function isInteger(obj) { return obj%1 === 0 } isInteger(3) // true isInteger(3.3) // false 以上输出可以看出这个函数挺好用,但对于字符串和某些特殊值显得力不从心 isInteger('') // true isInteger('3') // true isInteger(true) // true isInteger

  • java中求高精度除法,要求保留N位小数

    目录 求高精度除法,要求保留N位小数 题目要求 java 大数处理和高精度小数处理(so easy) 简单的例子: 部分简单代码 求高精度除法,要求保留N位小数 题目要求 高精度除法,要求保留N位小数(四舍五入),并且当整数部分为0时去除0的显示 import java.math.BigDecimal; import java.util.Scanner; public class BD { public static void main(String[] args) { Scanner scan

  • 浅谈Java中浮点型数据保留两位小数的四种方法

    目录 一.String类的方式 二.DecimalFormat类 三.BigDecimal类进行数据处理 四.NumberFormat类进行数据处理 总结一下 今天在进行开发的过程中遇到了一个小问题,是关于如何将double类型的数据保留两位小数.突然发现这方面有一点欠缺,就来总结一下. 一.String类的方式 该方式是是使用String的format()方法来实现的,该方法的作用就是规范数据的格式,第一个参数传入一个字符串来表示输出的数据格式,如保留两位小数就使用"%.2f",第二

  • Flex中对表格中某列的值进行数字格式化保留两位小数

    1.问题背景 一般的,表格中展示的比率,对比率的处理是:保留两位小数,并向上保留 2.实现实例 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="libr

  • JS中移除非数字最多保留一位小数

    js中移除非数字最多保留一位小数的实现代码如下所示: //去除非数字 var clearNoNum = function (item) { if (item!=null && item!=undefined) { //先把非数字的都替换掉,除了数字和. item = item.replace(/[^\d.]/g, ""); //必须保证第一个为数字而不是. item = item.replace(/^\./g, ""); //保证只有出现一个.而没有

  • python中round函数保留两位小数的方法

    在我们日常计算的过程中,如果计算出小数,对大量的被保留数据,采用四舍五入这种保留法的误差总和是最小的,能使被保留部分的与实际值差值不超过最后一位数量级的二分之一.四舍五入是一种精确度的保留法,是我们使用这种方法为基本保留法的原因.那在我们的python中如何四舍五入?如何保留小数?用round函数就可以. 1.round函数 python的内置函数,用于数字的四舍五入. 2.round 负数 四舍五入是围绕着0来计算的 示例 round(0.5) # 1.0 round(-0.5) #-1.0

随机推荐