社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

在python中0.1+0.2,谁能回答正确?我用1个多小时才知道

GISAI • 6 月前 • 299 次点击  
Python默认的float类型采用双精度浮点数(64位二进制存储),0.1等十进制小数在二进制中无法精确表示,导致计算误差。C#的decimal类型采用十进制存储,更适合精确计算(如金融场景),而Python需通过特定方法实现类似效果

在编程中,数值类型的精度直接影响计算的准确性,尤其是在科学计算、金融交易或高精度场景中。以下是 ‌Python‌ 和 ‌C#‌ 中常见数值类型的精度说明及对比:


Python 的数值精度

Python 是动态类型语言,数值类型的精度由底层实现自动处理。

1. 整数 (int)

  • 无固定大小‌:Python 3 的 int 可以表示任意大的整数(仅受内存限制)。
  • 示例‌:
    pythonCopy Code

    a = 123456789012345678901234567890# 直接支持超大整数

2. 浮点数 (float)

  • 双精度浮点‌:基于 IEEE 754 标准的 64 位双精度浮点数(C 语言的 double)。
  • 精度范围‌:大约 15-17 位有效数字。
  • 示例‌:
    pythonCopy Code

    b = 0.1 + 0.2# 结果为 0.30000000000000004(浮点数精度问题)

3. 高精度类型

  • decimal.Decimal‌:用于精确十进制运算(如金融场景),精度可自定义。

    pythonCopy Code

    from decimal import Decimal, getcontext
    getcontext().prec = 30# 设置精度为30位
    c = Decimal('0.1') + Decimal('0.2')  # 结果为0.3(精确)

  • fractions.Fraction‌:精确分数表示,避免浮点误差。

    python Copy Code

    from fractions import Fraction
    d = Fraction(13) + Fraction(16)  # 结果为 1/2


C# 的数值精度

C# 是静态类型语言,数值类型有明确的精度和范围定义。

1. 整数类型

类型
大小(位)
范围(含)
int
32
-2^31 到 2^31-1
long
64
-2^63 到 2^63-1
ulong
64
0 到 2^64-1

2. 浮点数

类型
大小(位)
精度(有效数字)
范围(近似)
float
32
~7 位
±1.5×10^-45 到 ±3.4×10^38
double
64
~15-17 位
±5.0×10^-324 到 ±1.7×10^308

3. 高精度类型

  • decimal‌:128 位十进制类型,适用于金融计算。

    csharpCopy Code

    decimal a = 0.1m;
    decimal b = 0.2m;
    decimal c = a + b;  // 结果为精确的0.3

    • 精度‌:28-29 位有效数字。
    • 范围‌:±1.0×10^-28 到 ±7.9×10^28。
  • System.Numerics.BigInteger‌:任意大小的整数(需要引用 System.Numerics)。

    csharpCopy Code

    BigInteger bigInt = BigInteger.Parse("123456789012345678901234567890");


关键差异与注意事项

  1. 整数处理‌:

  • Python 的 int 无溢出问题,C# 的整数溢出会抛出异常(除非使用 checked/unchecked 上下文)。
  • 浮点误差‌:

    • 两语言均遵循 IEEE 754,但 decimal 类型(C#)和 Decimal(Python)可避免二进制浮点误差。
  • 性能‌:

    • C# 的原始类型(如 intdouble)性能优于 Python。
    • Python 的高精度类型(如 Decimal)和动态大整数适合开发效率优先的场景。
  • 高精度计算‌:

    • C# 的 decimal 是原生类型,Python 需导入 decimal 模块。

    总结

    • 需要高精度计算‌:优先使用 decimal(C#)或 Decimal(Python)。
    • 超大整数‌:Python 的 int 更方便,C# 需用 BigInteger
    • 科学计算‌:双精度浮点(double/float)适合,但需注意精度损失。

    根据场景选择合适的类型,避免隐式类型转换导致意外错误!


    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/192497