C# Decimal

文章目录

  • 前言
  • 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# 中一个非常优秀的数值类型,特别适用于需要高精度和准确性的场景,如金融计算。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库-mysql(基本语句)

演示工具&#xff1a;navicat 连接&#xff1a;mydb 一.操作数据库 1.创建数据库 ①create database 数据库名称 //普通创建 ②create database if not exists 数据库名称 //创建数据库&#xff0c;判断不存在&#xff0c;再创建&#xff1a; 使用指定数据库 use 数据库…

使用Tesseract进行图片文字识别

Tesseract介绍 Tesseract 是一个开源的光学字符识别&#xff08;OCR&#xff09;引擎&#xff0c;最初由 HP 在 1985 年至 1995 年间开发&#xff0c;后来被 Google 收购并开源。Tesseract 支持多种语言的文本识别&#xff0c;能够识别图片中的文字&#xff0c;并将其转换为可…

智慧营区解决方案

1. 数据处理与服务封装 该智慧化解决方案注重数据的全面采集与处理&#xff0c;包括网页数据、图片、视频等非结构化数据&#xff0c;以及系统数据、文本、关系型数据库等结构化数据。通过数据抽取、稽核、规整、解析、清洗等流程&#xff0c;实现数据的入库与存储&#xff0c…

信号level 1:信号的产生

目录 引言 基础知识&#xff08;背景&#xff09; 信号的产生 方法一&#xff1a;通过终端按键产生信号&#xff08;键盘按键输入&#xff09; 方式二&#xff1a;通过kill指令 方法3&#xff1a;系统调用 方法四&#xff1a;硬件异常 方法五&#xff1a;软件产生异常 进…

国城杯-misc-Tr4ffIc_w1th_Ste90 [WP]

打开流量包&#xff0c;发现主要是UDP流量&#xff0c;然后还有H264的视频数据 右击&#xff0c;UDP追踪流 然后更换为原始数据 另存为.ts的文件&#xff0c;打开就看到密码 !t15tH3^pAs5W#RD*f0RFL9 打开压缩包是一个文件和一个图片 import numpy as np import cv2 import …

【SpringMVC】参数传递 重定向与转发 REST风格

文章目录 参数传递重定向与转发REST风格 参数传递 ModelAndView&#xff1a;包含视图信息和模型数据信息 public ModelAndView index1(){// 返回页面ModelAndView modelAndView new ModelAndView("视图名");// 或// ModelAndView modelAndView new ModelAndView(…

Minio使用教程

Minio介绍 Minlo是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小&#xf…

新手前端开发入职公司全流程

作为一名前端开发新手&#xff0c;进入一家公司开启职业生涯是既兴奋又充满挑战的旅程。今天就来和大家分享一下这个过程中的各个环节。 一、入职准备 在收到心仪公司的offer后&#xff0c;可别只顾着高兴啦。首先要准备好入职资料&#xff0c;像身份证、学历证明这些是必不可…

那智机器人报警白屏

那智机器人内存太多白屏报警&#xff01;&#xff01;&#xff01;下面来说说如何消除该报警吧&#xff01;&#xff01;&#xff01; 白屏报警的处理办法 解决办法&#xff1a;&#xff08;外部内存清理&#xff09; 升级操作者权限 &#xff08;当我们在维修见面不能看见我…

rk3568之mpp开发笔记mpp移植到开发板

前言&#xff1a; 大家好&#xff0c;今天给大家介绍的内容是rk平台的mpp编解码这块的内容&#xff0c;在rk目前看到有三套框架涉及到编解码内容&#xff1a; 1、rkmedia 2、rockit 3、mpp 这三种不同形式的编解码方式&#xff0c;后面再做详细的框架对比&#xff0c;今天我…

【设计模式】结构型设计模式总结之代理模式、装饰模式、外观模式、享元模式

文章目录 代理模式示例结构分类动态代理 装饰模式示例结构使用场景与代理模式区别Context 外观模式结构示例使用场景Context 享元模式结构示例使用场景Message 代理模式 代理模式&#xff08;Proxy Pattern&#xff09; 是一种结构型设计模式&#xff0c;它提供了一个代理对象…

CSS一些小点 —— 12.7

1. box-sizing: border-box box-sizing 属性&#xff0c;默认值为 content-box box-sizing: border-box 使padding和border的值不会再影响元素的宽高&#xff1b;padding和border的值算在指定宽高的内部&#xff08;但是外边距依然算做外部&#xff09; 2. overflow: hidden …

【毕业设计选题】深度学习类毕业设计选题参考 开题指导

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整…

算法基础学习Day4(双指针)

文章目录 1.题目2.题目解答1.查找总价格为目标值的两个商品1.1题目及题目解析1.2算法学习暴力解法优化算法 1.3代码提交 2.三数之和2.1题目及题目解析2.2算法学习2.3代码提交 1.题目 LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09;15. 三数之…

哪里可以找到高质量的街道夜景短视频素材?夜景素材网站推荐

在短视频创作的浪潮中&#xff0c;街道夜景作为一种视觉效果独特、氛围浓郁的题材&#xff0c;深受创作者的青睐。不论是商业广告、创意短片还是个人Vlog&#xff0c;街道夜景的视频素材都能为你的作品增添不小的分量。那么&#xff0c;在哪里可以找到这些高质量的街道夜景短视…

实习冲刺第四十三天

25.K个一组翻转链表 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单…

[计算机网络] HTTP/HTTPS

一. HTTP/HTTPS简介 1.1 HTTP HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 工作在 TCP/IP 模型之上&#xff0c;通常使用端口 …

微信创建小程序码 - 数量不受限制

获取小程序码&#xff1a;小程序码为圆图&#xff0c;且不受数量限制。 目录 文档 接口地址 请求方式 功能描述 注意事项 获取 scene 值 请求参数 返回参数 对接 请求方法 获取小程序码 调用获取小程序码 总结 文档 接口地址 https://api.weixin.qq.com/wxa/get…

在做题中学习(79):最小K个数

解法&#xff1a;快速选择算法 说明&#xff1a;堆排序也是经典解决问题的算法&#xff0c;但时间复杂度为&#xff1a;O(NlogK)&#xff0c;K为k个元素 而将要介绍的快速选择算法的时间复杂度为: O(N) 先看我的前两篇文章&#xff0c;分别学习&#xff1a;数组分三块&#…

第427场周赛: 转换数组、用点构造面积最大的矩形 Ⅰ、长度可被 K 整除的子数组的最大元素和、用点构造面积最大的矩形 Ⅱ

Q1、转换数组 1、题目描述 给你一个整数数组 nums&#xff0c;它表示一个循环数组。请你遵循以下规则创建一个大小 相同 的新数组 result &#xff1a; 对于每个下标 i&#xff08;其中 0 < i < nums.length&#xff09;&#xff0c;独立执行以下操作&#xff1a; 如…