C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# 浮点数与定点数

C# 浮点数与定点数的原理与用法对比

作者:星夜泊客

浮点数和定点数在内部的表示方式不同,导致它们的 精度、范围、性能、使用场景 都有明显区别,本文将详细剖析两者的原理与对比,感兴趣的朋友跟随小编一起看看吧

C# 浮点数与定点数详细解析

在 C# 中,数值类型主要分为:

浮点数和定点数在内部的表示方式不同,导致它们的 精度、范围、性能、使用场景 都有明显区别。本文将详细剖析两者的原理与对比。

1️⃣ 浮点数(float / double)

1.1 表示方法(IEEE 754)

浮点数采用 二进制科学计数法 存储:

值 = (-1)^符号位 × 1.尾数 × 2^(指数 - 偏移量)
类型位数符号位指数位尾数位
float321823
double6411152

👉 范围极大,但精度有限。某些小数在二进制中无法精确表示。

1.2 小数的二进制表示

浮点数小数用 2 的负次方来组合:

0.101₂ = 2⁻¹ + 2⁻³ = 0.5 + 0.125 = 0.625

但像 0.1 这样的十进制分数,在二进制中是无限循环小数:

0.1₁₀ = 0.0001100110011...₂

只能近似存储 → 运算会出现误差。

1.3 常见误差示例

Console.WriteLine(0.1 + 0.2 == 0.3);  // False
Console.WriteLine(0.1 + 0.2);         // 0.30000000000000004

原因:二进制截断 → 加法结果不是精确的 0.3。

1.4 特殊值

浮点数里其实还藏着几个特别的数,它们在实际开发里经常会遇到:

1.5 浮点数比较正确姿势

  1. 近似比较(epsilon 容差)
bool IsEqual(double a, double b, double eps = 1e-10)
    => Math.Abs(a - b) < eps;
  1. 游戏开发常见做法(Godot / Unity)
Mathf.Approximately(a, b);      // Unity
Mathf.IsEqualApprox(a, b);      // Godot
  1. 避免直接用 ==
    除非数据本身是整数运算得来的,或者特别确定是完全相等。

2️⃣ 定点数(decimal)

2.1 表示方法

2.2 特点

2.3 示例

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

👉 在货币、金融计算中,应优先使用 decimal

3️⃣ 性能对比

特性float/double(浮点数)decimal(定点数)
存储方式二进制科学计数法十进制定点数
精度有误差(约 15~16 位)高精度(28~29 位)
范围极大较小
运算速度硬件支持,速度极快慢(软件实现)
适用场景科学计算、物理模拟金融、货币

4️⃣ 小结

到此这篇关于C# 浮点数与定点数详细解析的文章就介绍到这了,更多相关C# 浮点数与定点数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文