C#中级、double和decimal区别解析

 更新时间:2025年11月20日 11:13:03   作者:Charles_go  
在 C# 中,double和decimal都是用来表示带小数的数值类型,但它们在内部表示、精度、性能和适用场景上有本质区别,本文给大家介绍C#中级、double和decimal区别解析,感兴趣的朋友跟随小编一起看看吧

在 C# 中,doubledecimal 都是用来表示带小数的数值类型,但它们在内部表示、精度、性能和适用场景上有本质区别。选择错误的类型可能导致严重精度问题(尤其在金融计算中)。

✅ 一句话总结区别

  • double:64 位双精度浮点数,基于 IEEE 754 标准,速度快、范围大,但有舍入误差 → 适合科学计算、图形、物理模拟。
  • decimal:128 位高精度十进制数,无二进制舍入误差,专为金融和货币计算设计 → 精确但速度慢、范围小。

🔍 详细对比表

特性doubledecimal
关键字doubledecimal
.NET 类型System.DoubleSystem.Decimal
存储大小64 位(8 字节)128 位(16 字节)
精度15-17 位有效数字28-29 位有效数字
数值范围±5.0 × 10⁻³²⁴ 到 ±1.7 × 10³⁰⁸±1.0 × 10⁻²⁸ 到 ±7.9 × 10²⁸
内部表示二进制浮点(以 2 为底)十进制浮点(以 10 为底)
是否精确表示 0.1?❌ 不能(有舍入误差)✅ 能(精确)
性能⚡ 快(CPU 硬件直接支持)🐢 慢(软件模拟)
默认字面量后缀无(如 3.14double需加 mM(如 3.14m

💥 关键区别:精度 vs 速度

❌double的经典陷阱:0.1 + 0.2 ≠ 0.3

double a = 0.1;
double b = 0.2;
double sum = a + b;
Console.WriteLine(sum == 0.3);        // False!
Console.WriteLine(sum);               // 0.30000000000000004

原因:0.1 在二进制中是无限循环小数,无法精确表示。

✅decimal精确计算:

decimal a = 0.1m;
decimal b = 0.2m;
decimal sum = a + b;
Console.WriteLine(sum == 0.3m);       // True!
Console.WriteLine(sum);               // 0.3

📌 字面量写法注意

// double(默认)
double d1 = 123.45;    // OK
double d2 = 123.45d;   // 显式 d 后缀(可选)
// decimal(必须加 m/M)
decimal m1 = 123.45m;  // ✅ 正确
decimal m2 = 123.45;   // ❌ 编译错误!会先当作 double,再隐式转换(可能丢失精度)

⚠️ 永远不要写 decimal x = 0.1; —— 这会先创建一个不精确的 double,再转成 decimal,错误已发生!

🧪 适用场景对比

✅ 使用double的场景:

  • 科学计算(物理、工程)
  • 图形渲染、游戏开发(坐标、速度)
  • 机器学习、统计分析
  • 对性能敏感、允许微小误差的场景

✅ 使用decimal的场景:

  • 金融、会计、货币计算(必须精确到分)
  • 税务计算
  • 任何需要十进制精确表示的业务逻辑
  • 用户输入的金额、价格等

💡 黄金法则:
“涉及钱的地方,永远用 decimal!”

⚠️ 常见误区

❌ 误区 1:decimal能表示任意大的数

虽然 decimal 精度高,但最大值只有约 7.9 × 10²⁸,远小于 double 的 10³⁰⁸。
如果需要超大数,考虑 BigInteger(整数)或自定义类型。

❌ 误区 2:decimal性能差到不能用

虽然比 double 慢(约 10-20 倍),但在现代 CPU 上,一次 decimal 加法仍只需几十纳秒
对于金融系统(每秒几百笔交易),完全够用。

❌ 误区 3:可以用double存金额,只要四舍五入

即使显示时四舍五入,内部累积误差仍会导致对账不平
例如:1000 次 0.1 元累加,double 可能变成 99.99999999999999。

✅ 最佳实践建议

场景推荐类型
金额、价格、利率decimal
科学/工程计算double
数据库字段金额用 DECIMAL(p,s),科学数据用 FLOAT/DOUBLE
API 设计金融接口参数/返回值用 decimal
常量定义public const decimal TaxRate = 0.13m;

🧠 总结

问题答案
哪个更精确?decimal(十进制无误差)
哪个更快?double(硬件加速)
存钱用哪个?必须用 decimal
0.1 能精确表示吗?double ❌,decimal
字面量怎么写?double: 3.14decimal: 3.14m

💡 记住:
double 为速度而生,decimal 为正确而战。”
在金融世界里,一分钱都不能错——这就是 decimal 的存在意义。

问题

double和float有什么区别

double占用64位内存,而float占用32位

什么是NaN

NaN表示非数字,它是double或float可以具有特殊值,0除以0的结果

到此这篇关于C#中级、double和decimal有什么区别的文章就介绍到这了,更多相关C# 中级、double和decimal区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# 使用鼠标点击对Chart控件实现数据提示效果

    C# 使用鼠标点击对Chart控件实现数据提示效果

    这篇文章主要介绍了C# 使用鼠标点击对Chart控件实现数据提示效果,文章给予上一篇的详细内容做延伸介绍,需要的小伙伴可任意参考一下
    2022-08-08
  • WPF中引入WindowsForms控件的方法

    WPF中引入WindowsForms控件的方法

    这篇文章主要介绍了WPF中引入WindowsForms控件的方法,结合实例形式分析了在WPF中调用Windows Forms控件的具体步骤与相关实现技巧,需要的朋友可以参考下
    2016-07-07
  • C#聊天程序服务端与客户端完整实例代码

    C#聊天程序服务端与客户端完整实例代码

    这篇文章主要介绍了C#聊天程序服务端与客户端完整实例代码,很经典的应用,需要的朋友可以参考下
    2014-07-07
  • 基于C#实现FTP下载文件

    基于C#实现FTP下载文件

    这篇文章主要为大家详细介绍了如何利用C#实现FTP下载文件,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C# Linq延迟查询的执行实例代码

    C# Linq延迟查询的执行实例代码

    这篇文章主要介绍了C# Linq延迟查询执行的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 基于WPF+Prism实现动态分页加载图片的方法

    基于WPF+Prism实现动态分页加载图片的方法

    在做图片浏览器程序时,遇到图片数量巨大的情况(如几百张、上千张),一次性加载所有图片会导致界面卡顿甚至程序崩溃,所以本文介绍了基于WPF + Prism实现动态分页加载图片的方法,需要的朋友可以参考下
    2025-09-09
  • 深入c# GDI+简单绘图的具体操作步骤(四)

    深入c# GDI+简单绘图的具体操作步骤(四)

    本篇文章是向大家介绍了如何做一个类似windows画图工具的具体方法,需要的朋友参考下
    2013-05-05
  • C#中删除字符串指定位置字符的5种方法

    C#中删除字符串指定位置字符的5种方法

    文章介绍了在C#中删除字符串中第x个字符的几种方法,包括String.Remove()、Substring()、StringBuilder、字符数组和LINQ,并提供了完整示例,推荐使用String.Remove()方法,因其简洁高效,下面小编通过代码为大家详细说说,需要的朋友可以参考下
    2026-02-02
  • WPF实现环(圆)形菜单的示例代码

    WPF实现环(圆)形菜单的示例代码

    这篇文章主要介绍了如何利用WPF绘制一个简单的环形菜单,文中的示例代码讲解详细,对我们学习或工作有一定帮助,需要的可以参考一下
    2022-07-07
  • C#使用ODBC与OLEDB连接数据库的方法示例

    C#使用ODBC与OLEDB连接数据库的方法示例

    这篇文章主要介绍了C#使用ODBC与OLEDB连接数据库的方法,结合实例形式分析了C#基于ODBC与OLEDB实现数据库连接操作简单操作技巧,需要的朋友可以参考下
    2017-05-05

最新评论