C#底层库--数值扩展(将小数值按指定的小数位数舍入)

发布于:2025-02-19 ⋅ 阅读:(14) ⋅ 点赞:(0)

系列文章

C#底层库–万能进制转换器(自定义有序字符,支持任意进制)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130444724

C#底层库–StringExtension字符串扩展类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129520428

C#底层库–MySQL数据库访问操作辅助类(推荐阅读)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886379

C#底层库–SQLBuilder构建类(自研ORM)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129179216

C#底层库–XML配置参数读写辅助类(推荐阅读)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129175304

C#底层库–数据库类型与程序类型转换器
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817610

C#底层库–文件上传辅助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817487

C#底层库–RegexHelper正则表达式辅助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/109745286

C#底层库–程序日志记录类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124187709

C#底层库–排序算法帮助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124495730

C#底层库–SQLite的使用(轻量、单击数据库)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/123666958

C#底层库–获取文件版本和MD5值
本文链接:https://blog.csdn.net/youcheng_ge/article/details/112513871

C#底层库–文件操作类(文件重命名、目录移动、字节流转换)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126887161

C#底层库–Excel数据读取类(可读加密表格)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126887445

C#底层库–随机数生成器
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126888812

C#底层库–CSV和DataTable相互转换
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128804367

C#底层库–JSON使用教程_详细(序列化、反序列化、转DataTable)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128805705

C#底层库–cookie使用教程
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128816347

C#底层库–Session操作辅助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817096

C#底层库–Image图片操作类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128805298

C#底层库–图片增加水印辅助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817184

C#底层库–数据实体类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128816638

C#底层库–网络通信帮助类HTTP
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886697


前言

本专栏为【底层库】,主要介绍编程过程中 通用函数。我们将这些通用固化的源码,进行重写、封装、拓展,再进行单元测试、集成测试、beta测试,最终形成通用化模板,这里我们称为“底层库”。

作为研发人员的你,并不需要花大量时间,研究“底层库”的含义,及“底层库”的实现方法。你只需要几行调用代码,就可以解决项目上碰到的难题。而底层库使用方法,本专栏均有详细介绍,也有项目应用场景。

底层库已实现功能:MySQL脚本构建器、MySQL数据库访问操作、参数配置文件读写、加解密算法、日志记录、HTTP通信、Socket通信、API前后端交互、邮件发送、文件操作、配置参数存储、Excel导入导出、CSV和DataTable转换、压缩解压、自动编号、Session操作等。

本专栏会持续更新,不断优化【底层库】,大家有任何问题,可以私信我。本专栏之间关联性较强(我会使用到某些底层库,某些文章可能忽略介绍),如果您对本专栏感兴趣,欢迎关注,我将带你用最简洁的代码,实现最复杂的功能。
在这里插入图片描述

一、底层库作用

DecimalUtil数值扩展类,将小数值按指定的小数位数舍入、将小数值按指定的小数位数截取、检查数值小数位:超出指定长度抛出异常信息.

二、底层库源码

创建类DecimalUtil.cs,复制以下代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Common
{
    /// <summary>
    /// 数值扩展
    /// </summary>
    public static class DecimalUtil
    {
        /// <summary>
        /// 将小数值按指定的小数位数舍入
        /// 解决SAP接口自动将3位小数后加0转为4位小数报错Server Error的问题
        /// </summary>
        /// <param name="d">要舍入的小数</param>
        /// <param name="decimals">返回值中的小数位数,默认3</param>
        /// <returns></returns>
        public static decimal AppRound(this decimal d, int decimals = 3)
        {
            var multiple = (decimal)Math.Pow(10, decimals);
            //竟然带上MidpointRounding.AwayFromZero的四舍五入才是对的
            var result = Math.Round(d * multiple, MidpointRounding.AwayFromZero) / multiple;
            return result;
        }

        /// <summary>
        /// 将小数值按指定的小数位数舍入
        /// 解决SAP接口自动将3位小数后加0转为4位小数报错Server Error的问题
        /// </summary>
        /// <param name="d">要舍入的小数</param>
        /// <param name="decimals">返回值中的小数位数,默认3</param>
        /// <returns></returns>
        public static double AppRound(this double d, int decimals = 3)
        {
            var multiple = Math.Pow(10, decimals);
            //竟然带上MidpointRounding.AwayFromZero的四舍五入才是对的
            var result = Math.Round(d * multiple, MidpointRounding.AwayFromZero) / multiple;
            return result;
        }

        /// <summary>
        /// 将小数值按指定的小数位数截取
        /// </summary>
        /// <param name="d">要截取的小数</param>
        /// <param name="decimals">返回值中的小数位数</param>
        /// <returns></returns>
        public static decimal AppCut(this decimal d, int decimals)
        {
            var strDecimal = d.ToString();
            var index = strDecimal.IndexOf(".");
            if (index == -1 || strDecimal.Length < index + decimals + 1)
            {
                strDecimal = string.Format("{0:F" + decimals + "}", d);
            }
            else
            {
                var length = index;
                if (decimals != 0)
                {
                    length = index + decimals + 1;
                }
                strDecimal = strDecimal.Substring(0, length);
            }
            return decimal.Parse(strDecimal);
        }

        /// <summary>
        /// 将小数值按指定的小数位数截取
        /// </summary>
        /// <param name="d">要截取的小数</param>
        /// <param name="decimals">返回值中的小数位数</param>
        /// <returns></returns>
        public static double AppCut(this double d, int decimals)
        {
            var strDecimal = d.ToString();
            var index = strDecimal.IndexOf(".");
            if (index == -1 || strDecimal.Length < index + decimals + 1)
            {
                strDecimal = string.Format("{0:F" + decimals + "}", d);
            }
            else
            {
                var length = index;
                if (decimals != 0)
                {
                    length = index + decimals + 1;
                }
                strDecimal = strDecimal.Substring(0, length);
            }
            return double.Parse(strDecimal);
        }

        /// <summary>
        /// 检查数值小数位:超出指定长度抛出异常信息
        /// </summary>
        /// <param name="d">数值</param>
        /// <param name="decimals">小数位长度:默认3位</param>
        public static void CheckDecimalPlaces(this decimal d, int decimals = 3)
        {
            if (d == 0)
                return;

            var dStr = d.ToString();
            var dStrArr = dStr.Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries);
            if (dStrArr.Length > 1 && dStrArr[1].Length > decimals)
                throw new Exception($"操作量 {d} 小数位不能大于 {decimals} 位,请确认!");
        }

    }
}

三、使用方法

四、项目样例

五、资源链接


网站公告

今日签到

点亮在社区的每一天
去签到