美文网首页
Python3 - 执行精确的浮点数运算

Python3 - 执行精确的浮点数运算

作者: 惑也 | 来源:发表于2018-12-19 23:35 被阅读35次

问题

对浮点数执行精确的计算操作,并且不希望有任何小误差的出现。

解决方案

浮点数的一个普遍问题是它们并不能精确的表示十进制数。并且,即使是最简单的数学运算也会产生小的误差。

a = 2.1
b = 4.2
c = a + b
print(c)
print(c == 6.3)

6.300000000000001
False

这些错误是由底层CPU和IEEE754标准通过自己的浮点单位去执行算术时的特征,由于Python的浮点数据类型使用底层表示数据存储,因此你没办法避免这样的误差。

如果需要更加精确,并能容忍一定的性能损耗,可以使用 decimal 模块:

from decimal import Decimal

a = Decimal('2.1')
b = Decimal('4.2')
c = a + b
print(c)
print(c == Decimal('6.3'))

6.3
True

Decimal 对象会像普通浮点数一样,支持所有的常用数学运算。 打印或者进行字符串格式化时,跟普通浮点数没有区别。

讨论

decimal 模块实现了IBM的“通用小数运算规范”。

Python新手会倾向于使用 decimal 模块来处理浮点数的精确运算。 然而,先理解你的应用程序目的是非常重要的。 如果你是在做科学计算或工程领域的计算、电脑绘图,或者是科学领域的大多数运算, 那么使用普通的浮点类型是比较普遍的做法。 其中一个原因是,在真实世界中很少会要求精确到普通浮点数能提供的17位精度。 因此,计算过程中的那么一点点的误差是被允许的。 第二点就是,原生的浮点数计算要快的多-有时候你在执行大量运算的时候速度也是非常重要的。

即便如此,却不能完全忽略误差。数学家花了大量时间去研究各类算法,有些处理误差会比其他方法更好。 也得注意下减法删除以及大数和小数的加分运算所带来的影响。比如:

nums = [1.23e+18, 1, -1.23e+18]
print(sum(nums))
0.0

上面的错误可以利用 math.fsum() 所提供的更精确计算能力来解决:

import math
nums = [1.23e+18, 1, -1.23e+18]
print(math.fsum(nums))
1.0

总的来说, decimal 模块主要用在涉及到金融的领域。 在这类程序中,哪怕是一点小小的误差在计算过程中蔓延都是不允许的。

当Python和数据库打交道的时候,也通常会遇到 Decimal 对象,通常也是在处理金融数据的时候。

相关文章

  • Python3 - 执行精确的浮点数运算

    问题 对浮点数执行精确的计算操作,并且不希望有任何小误差的出现。 解决方案 浮点数的一个普遍问题是它们并不能精确的...

  • MySQL浮点计算存在的问题与解决方案

    在计算机中,浮点数往往很难精确表示,那么浮点数运算结果也往往难以精确表示。MySQL同样也存在这个问题。 解决方案...

  • 使用 `Decimal`模块执行精确的浮点数运算

    Python v3.10.6 背景 浮点数的一个普遍问题是它们并不能精确的表示十进制数。 并且,即使是最简单的数学...

  • Java基础知识陷阱

    Java浮点数精确运算陷阱 System.out.println(2.0 - 1.1); 以上结果为0.89999...

  • javaScript-02

    运算符 算数运算符 概念:算术运算使用的符号,用于执行两个变量或值的算术运算。 浮点数的精度问题浮点数值的最高精度...

  • 第11章 编写精确代码所需编码准则

    11.1 计算机并不如想象得那么精确 数字电路机器无法准确表示小数。 11.2 需要进行精确计算时避开浮点数运算 ...

  • python基础

    1整数与浮点数 在数据类型中我们学习了,整数和浮点数在计算机内部存储方式不同,整数运算永远是精确的,而浮点数则可能...

  • JS篇

    时间戳转换为年月日核心代码 input标签只输入数字 JS运算浮点数运算会有计算bug精确两位用toFixed(2...

  • 浮点数运算结果不精确

    先来看代码 这里预计输出是0.1,但实际不是这样,下面是输出结果 出现这种结果是因为float与double类型主...

  • Python3 - 数字的四舍五入

    问题 对浮点数执行指定精度的舍入运算。 解决方案 对于简单的舍入运算,使用内置的 round(value, ndi...

网友评论

      本文标题:Python3 - 执行精确的浮点数运算

      本文链接:https://www.haomeiwen.com/subject/zztekqtx.html