C# 7.0 核心技术指南 (27):C#语言基础 2.4.8&2.4.9

阅读数:7 2019 年 11 月 30 日 23:38

C# 7.0核心技术指南(27):C#语言基础 2.4.8&2.4.9

(double 和 decimal 的对比)

内容简介
本书前三章将集中介绍 C#语言。首先介绍基本的语法、类型和变量。而后会介绍一些高级的特性,如不安全代码以及预处理指令。如果你是 C#语言的初学者,请循序渐进地阅读这些章节。
其余各章则涵盖了.NET Framework 的核心功能,包括 LINQ、XML、集合、并发、I/O 和网络、内存管理、反射、动态编程、特性、安全、应用程序域和原生互操作性等主题。第 6 章和第 7 章是后续主题的基础,除这两章之外,其余各章可以按照需要以任何顺序阅读。LINQ 相关的三个章节好按顺序阅读。其中的一些章节需要一些并发相关的知识,这些知识将在第 14 章中介绍。

double 类型在科学计算(例如计算空间坐标)时很有用。decimal 类型在金融计算和计算那些“人为”的而非真实世界度量的结果时很有用。下面是这两种类型的不同之处:

种类 double decimal
内部表示 基数为 2 基数为 10
精度 15~16 位有效数字 28~29 位有效数字
范围 ±(~10-324到~10308) ±(~10-28到~1028)
特殊值 +0、-0、+∞、-∞以及 NaN
速度 处理器原生支持 非处理器原生支持(大约比 double 慢十倍)

(实数的舍入误差)

float 和 double 在内部都是基于 2 来表示数值的。因此只有基于 2 表示的数值才能够精确表示。事实上,这意味着大多数有小数部分的字面量(它们都基于 10)将无法精确表示。例如:

复制代码
float tenth = 0.1f; // Not quite 0.1
float one = 1f;
Console.WriteLine (one - tenth * 10f); // -1.490116E-08

这就是为什么 float 和 double 不适合金融运算。相反,decimal 基于 10,它能够精确表示基于 10 的数值(也包括它的因数,基于 2 和基于 5 的数值)。因为实数的字面量都是基于 10 的,所以 decimal 能够精确表示像 0.1 这样的数。然而,double 和 decimal 都不能精确表示那些基于 10 的循环小数:

复制代码
decimal m = 1M / 6M; // 0.1666666666666666666666666667M
double d = 1.0 / 6.0; // 0.16666666666666666

这将会导致积累性的舍入误差:

复制代码
decimal notQuiteWholeM = m+m+m+m+m+m; // 1.0000000000000000000000000002M
double notQuiteWholeD = d+d+d+d+d+d; // 0.99999999999999989

这也将影响相等和比较操作:

复制代码
Console.WriteLine (notQuiteWholeM == 1M); // False
Console.WriteLine (notQuiteWholeD < 1.0); // True

C# 7.0核心技术指南(27):C#语言基础 2.4.8&2.4.9

购书地址 https://item.jd.com/12681788.html?dist=jd

评论

发布