C# Decimal

news2025/1/16 19:11:29

文章目录

  • 前言
  • 1. Decimal 的基本特性
  • 2. 基本用法示例
  • 3. 特殊值与转换
  • 4. 数学运算示例
  • 5. 精度处理示例
  • 6. 比较操作示例
  • 7. 货币计算示例
  • 8. Decimal 的保留小数位数
  • 9. 处理 Decimal 的溢出和下溢
  • 10. 避免浮点数计算误差
  • 总结


前言

  decimal 是 C# 中一种用于表示高精度十进制数的关键字。它主要用于金融和其他需要精确计算的场景,因其能够减少因浮点数运算产生的误差。decimal 类型能够表示的数值范围较大,并且保持精度,适合需要精确表示的场合。
在这里插入图片描述

1. Decimal 的基本特性

大小和范围: decimal 类型占用 128 位(16 字节),其有效位数为 28-29 位数字,能够表示的数值范围为 -79,228,162,514,264,337,593,543,950,335 到 79,228,162,514,264,337,593,543,950,335。
精度: decimal 类型是一个高精度的数据类型,适合用来表示金融货币的数值,能够尽量避免因舍入错误而导致的财务问题。
运算: decimal 类型支持加、减、乘、除等基本运算。

2. 基本用法示例

using System;

class Program
{
    static void Main()
    {
        // 声明 decimal 变量
        decimal price = 19.99m; // 使用 'm' 后缀来表示 decimal 类型
        decimal quantity = 3;
        decimal totalCost = price * quantity;

        Console.WriteLine($"每个价格: {price}, 数量: {quantity}, 总费用: {totalCost}");
    }
}

3. 特殊值与转换

  可以通过 Convert 类将其他数据类型转换为 decimal 类型,也可以通过格式化的方式进行输出。使用 decimal 时,通常要注意转换时可能出现的精度问题。

using System;

class Program
{
    static void Main()
    {
        // 从其他类型转换
        double d = 10.5;
        decimal decValue = Convert.ToDecimal(d);

        Console.WriteLine($"转换后的 decimal 值: {decValue}");

        // 显示格式化
        decimal amount = 123456.789m;
        Console.WriteLine($"格式化金额: {amount:C}"); // C 表示货币格式
    }
}

4. 数学运算示例

  decimal 支持多种数学运算,以下示例展示了加减乘除操作及结果的精确性。

using System;

class Program
{
    static void Main()
    {
        decimal a = 10.5m;
        decimal b = 3.3m;

        decimal addResult = a + b;
        decimal subResult = a - b;
        decimal mulResult = a * b;
        decimal divResult = a / b;

        Console.WriteLine($"加法结果: {addResult}");
        Console.WriteLine($"减法结果: {subResult}");
        Console.WriteLine($"乘法结果: {mulResult}");
        Console.WriteLine($"除法结果: {divResult}");
    }
}

5. 精度处理示例

  当处理涉及多个 decimal 运算时,您可能会需要控制小数位数,使用 Math.Round 方法可实现这一点。

using System;

class Program
{
    static void Main()
    {
        decimal value = 1.23456789m;

        // 保留两位小数
        decimal roundedValue = Math.Round(value, 2);
        Console.WriteLine($"原始值: {value}, 四舍五入后的值: {roundedValue}");
    }
}

6. 比较操作示例

  decimal 可以用于比较和排序操作,以下示例展示了如何比较两个 decimal 数值。

using System;

class Program
{
    static void Main()
    {
        decimal a = 100.25m;
        decimal b = 100.25m;
        decimal c = 200.50m;

        Console.WriteLine($"a == b: {a == b}");
        Console.WriteLine($"a < c: {a < c}");
        Console.WriteLine($"a > c: {a > c}");
    }
}

7. 货币计算示例

  在实际应用中,decimal 类型常常用于货币计算。以下示例演示了购物车中的商品总价计算。

using System;
using System.Collections.Generic;

class Program
{
    public class Product
    {
        public string Name { get; set; }
        public decimal Price { get; set; }
        public int Quantity { get; set; }
    }

    static void Main()
    {
        List<Product> cart = new List<Product>
        {
            new Product { Name = "图书", Price = 39.99m, Quantity = 2 },
            new Product { Name = "鼠标", Price = 29.99m, Quantity = 1 }
        };

        decimal totalAmount = 0;

        foreach (var product in cart)
        {
            totalAmount += product.Price * product.Quantity;
        }

        Console.WriteLine($"购物车总金额: {totalAmount:C}"); // 使用货币格式
    }
}

8. Decimal 的保留小数位数

  在某些情况下,需要将 decimal 保留固定的小数位数。可以借助 Math.Round 来实现。

using System;

class Program
{
    static void Main()
    {
        decimal value = 123.456789m;

        // 保留 3 位小数
        decimal result = Math.Round(value, 3);
        Console.WriteLine($"保留三位小数: {result}"); // 输出: 123.457
    }
}

9. 处理 Decimal 的溢出和下溢

  在数学计算中,避免溢出和下溢是非常重要的。可以使用 try-catch 处理计算时的异常情况。

using System;

class Program
{
    static void Main()
    {
        try
        {
            decimal largeValue = decimal.MaxValue;
            decimal result = largeValue + 1; // 可能溢出

            Console.WriteLine($"计算结果: {result}");
        }
        catch (OverflowException ex)
        {
            Console.WriteLine($"发生溢出: {ex.Message}");
        }
    }
}

10. 避免浮点数计算误差

  使用 decimal 可以避免常见的浮点数计算误差,例如,以下示例展示了一个浮点数计算的不准确性。

using System;

class Program
{
    static void Main()
    {
        float floatValue = 0.1f + 0.2f;
        Console.WriteLine($"浮点数计算: {floatValue}"); // 输出: 0.300000012

        decimal decimalValue = 0.1m + 0.2m;
        Console.WriteLine($"十进制计算: {decimalValue}"); // 输出: 0.3
    }
}

总结

  decimal 是 C# 中一个非常优秀的数值类型,特别适用于需要高精度和准确性的场景,如金融计算。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【理论·专业课】第三次作业

第1题&#xff08;存储管理_内存碎片&#xff09; 请指出内部碎片与外部碎片的区别&#xff61; ANS&#xff1a; 内部碎片是分配给进程但未被进程使用且无法被其他进程利用的内存空间 外部碎片是内存中因进程分配释放内存形成的不连续小块&#xff0c;虽总和够但因不连续无…

最新的springboot 3.x的支持s3协议的2.x方法的minio上传文件方法

拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/minio:latest运行命令 docker run -d \--name minio \-p 10087:9000 \-p 10088:9001 \-e MINIO_ROOT_USERminioadmin \-e MINIO_ROOT_PASSWORDY6HYraaphfZ9k8Lv \-v /data/minio/data:/data \-v /data/…

cocos creator接入字节跳动抖音小游戏JSAPI敏感词检测(进行文字输入,但输入敏感词后没有替换为*号)

今天更新了某个抖音小游戏的版本&#xff0c;增加了部分剧情&#xff0c;半天过后一条短信审核未通过&#xff0c;emmm…抖音总是能给开发者惊喜…打开电脑看看这次又整什么幺蛾子… 首先是一脸懵逼&#xff0c;后端早已接入了官方的内容安全检测能力了&#xff08;https://de…

Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理-方法二

1.先导入数据到origin 2.导入文件的时候注意&#xff1a;名字短的这个是&#xff0c;或者你打开后看哪个里面有800&#xff0c;因为我的激光重频是1.25Hz&#xff08;应该是&#xff0c;不太确定单位是KHz还是MHz&#xff09;&#xff0c;所以对应的时间是800s。 3.选中两列直接…

17. 面向对象的特征

一、面向对象的三大特征 面向对象的三大特征指的是 封装、继承、多态。 封装&#xff08;encapsulation&#xff0c;有时称为数据隐藏&#xff09;是处理对象的一个重要概念。从形式上看&#xff0c;封装就是将数据和行为组合在一个包中&#xff0c;并对对象的使用者隐藏具体的…

Apache Dolphinscheduler可视化 DAG 工作流任务调度系统

Apache Dolphinscheduler 关于 一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 DolphinScheduler 的主要特性如下&#xff1a; 易于部署&#xff0c;提供四种部署方式&am…

第二部分:基础知识 6.函数 --[JavaScript 新手村:开启编程之旅的第一步]

JavaScript 函数是可重用的代码块&#xff0c;用于执行特定任务。函数可以接受参数&#xff08;输入数据&#xff09;&#xff0c;并且可以返回一个值。JavaScript 提供了多种定义函数的方式&#xff0c;下面将详细介绍这些方式&#xff0c;并给出一些示例。 1. 函数声明 下面…

我眼中的“懂重构”(一)

初识重构 2017年的时候&#xff0c;领导让我看公司的一本书《重构——改善代码的既有设计》&#xff0c;这是一本JAVA版本的&#xff0c;前后看了2遍。那时候看书因为不懂看的格外仔细。我只是那时候不懂&#xff0c;然而多年后的今天我仍然发现很多人对重构充满误解。在刚进入…

机器学习详解(3):线性回归之代码详解

文章目录 1 数据预处理2 构建线性回归模型并绘制回归线初始化方法前向传播&#xff1a;forward_propagation代价函数&#xff1a;cost_function反向传播&#xff1a;backward_propagation参数更新&#xff1a;update_parameters训练方法&#xff1a;train代码运行结果 3 使用Py…

基于openzeppelin插件的智能合约升级

一、作用以及优点 部署可升级合约&#xff0c;插件自动部署proxy和proxyAdmin合约&#xff0c;帮助管理合约升级和交互&#xff1b;升级已部署合约&#xff0c;通过插件快速升级合约&#xff0c;脚本开发方便快捷&#xff1b;管理代理管理员的权限&#xff0c;只有proxyAdmin的…

游戏引擎学习第36天

仓库 :https://gitee.com/mrxiao_com/2d_game 回顾之前的内容 在这个程序中&#xff0c;目标是通过手动编写代码来从头开始制作一个完整的游戏。整个过程不使用任何库或现成的游戏引擎&#xff0c;这样做的目的是为了能够全面了解游戏执行的每一个细节。开发过程中&#xff0…

试题转excel;pdf转excel;试卷转Excel,word试题转excel

一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几乎需要一个下午的时间 关键这些事&#xff0c;枯燥无聊费眼睛&#xff0c;实在是看起来就很蠢的工作 就想着做一个工具&#xff0c;可以自动处理…

16-01、JVM系列之:内存与垃圾回收篇(一)

JVM系列之&#xff1a;内存与垃圾回收篇&#xff08;一&#xff09; ##本篇内容概述&#xff1a; 1、JVM结构 2、类加载子系统 3、运行时数据区之&#xff1a;PC寄存器、Java栈、本地方法栈一、JVM与JAVA体系结构 JAVA虚拟机与JAVA语言并没有必然的联系&#xff0c;它只是与特…

2030. gitLab A仓同步到B仓

文章目录 1 A 仓库备份 到 B 仓库2 B 仓库修改main分支的权限 1 A 仓库备份 到 B 仓库 #!/bin/bash# 定义变量 REPO_DIR"/home/xhome/opt/git_sync/zz_xx_xx" # 替换为你的本地库A的实际路径 REMOTE_ORIGIN"http://192.168.1.66:8181/zzkj_software/zz_xx_xx.…

服务器上部署前端页面-实现IP+端口/index.html在线访问你的网页

首先一点&#xff0c;不管是那个框架开发的网页前端&#xff0c;最后都需要Build,构建完毕以后都是原始的HTML CSS JS 三样文件&#xff01; 所以不管用原始的三剑客&#xff08;HTML CSS JS&#xff09;开发的前端还是用各类框架开发的前端界面&#xff08;只是让开发简单…

树莓派 PICO RP2040 MACOS 使用

文章参考&#xff1a; Developing in C on the RP2040: macOS | Wellys Dev 这里会提示报错&#xff1a;ln: /bin/picotool: Operation not permitted 参考&#xff1a;Mac ln命令报错&#xff1a;Operation not permitted_ln operation not permitted-CSDN博客 放在 usr/lo…

顶顶通电话机器人开发接口对接大语言模型之实时流TTS对接介绍

大语言模型一般都是流式返回文字&#xff0c;如果等全部文字返回了一次性去TTS&#xff0c;那么延迟会非常严重&#xff0c;常用的方法就是通过标点符号断句&#xff0c;返回了一句话就提交给TTS。随着流TTS的出现&#xff0c;就可以直接把大模型返回的文字灌给流TTS&#xff0…

git使用-创建本地仓库、绑定远程仓库

文章目录 1. 创建git仓库2. commit提交到本地3. 创建远程仓库4. 关联远程仓库5. push代码至远程仓库6. 完成初始化 git作为版本控制工具&#xff0c;在开发过程中经常使用到。这里以github为例&#xff0c;简单介绍下仓库的创建及绑定&#xff0c;方便忘记了能快速的想起来。 1…

JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)

目录 JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能&#xff0c;JS中排序算法的使用详解&#xff08;附实际应用代码&#xff09; 一、为什么要使用Array.sort() 二、Array.sort() 的使用与技巧 1、基础语法 2、返回值 3、…

为什么Unity里的变体数和UWA工具测出来的不一样

1&#xff09;为什么Unity里的变体数和UWA工具测出来的不一样 2&#xff09;使用TextureArray为什么会导致L1 Cache Miss率变高 3&#xff09;Gfx.PresentFrame耗时异常高 4&#xff09;AO方案中哪个更适合移动端 这是第412篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的…