- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在进行以下计算时遇到问题:
Decimal(3)*(Decimal(1)/Decimal(3))
它返回的不是 1.0,而是 0.999...
无论我将 Decimal
模块的精度提高多少,情况仍然如此。
完整代码如下:
from decimal import Decimal
from decimal import getcontext
getcontext().prec = 800
print Decimal(3)*(Decimal(1)/Decimal(3))
具有讽刺意味的是,使用“原生”float
解决了这个问题:
print float(3)*(float(1)/float(3))
不用说,我在这里使用 Decimal
进行涉及大数求幂的更复杂的计算。遇到这个问题后,我设法将其最小化为上面的示例。
最佳答案
扩展一下我的评论:
Python 中的十进制数实际上就是您可以手写的那种数字。重要的是,它不理解递归的概念,因此像 1/3
这样的无限循环分数只是表示为 0.333333333333..
直到你的精度点。当它乘以 3 时,你得到 0.99999..
- 这是明智的行为,因为它实际上不知道 0.33333333..
是 1/3
被截断后。 Decimal
通常会因为除法时的舍入而失去精度(事实上,当除以 2 或 5 以外的任何因子时)。如果能够进行除法是至关重要的,请使用 Fraction
,它表示任何有理数而不损失分子和分母的任何精度:
In [1]: from fractions import Fraction
In [2]: Fraction(3) * Fraction(1, 3)
Out[2]: Fraction(1, 1)
In [3]: print(_)
1
分数会自动化简。
对于您的 float ,我认为舍入误差自行抵消只是运气问题。请注意,float
或 Decimal
可能就足够了,除非您需要绝对 精度,在这种情况下我会推荐一个Fraction
(例如,这意味着您可以可靠地进行相等性测试)。你总是可以四舍五入一个丑陋的数字,让它至少看起来更漂亮一点:
In [4]: "{:.2f}".format(Decimal(3) * (Decimal(1) / Decimal(3)))
Out[4]: '1.00'
如果您正在做类似模拟的事情,0.9999999
和 1
之间的差异通常实际上并不重要。
另一种选择是重新调整您的操作顺序,以便保证分子可以被分母整除,如阿尼尔库马尔的回答。如果可能的话,这是一个很好的解决方案,但在某些情况下您可能无法这样做——例如,您期望结果是小数,或者您从某种黑匣子中得到小数被乘数。此时,可以同时跟踪 Decimal
分子和分母。然后您会意识到这就是 Fraction
类所做的,而且麻烦更少。
请注意,您可以将 Fraction
用于 Decimal
可以做的任何事情,但更重要的是。任何可表示的十进制数也是分数(10 的某个幂的尾数)。例如:
In [2]: Fraction("3.141")
Out[2]: Fraction(3141, 1000)
自然地,这会导致一些性能损失 - 分数必须跟踪更多数据,进行更多计算并且可能更加抽象。
查看您新提供的公式 - 请注意,当您将有理数乘以非整数的幂时,结果可能不是有理数,因此您可能会在此过程中的某个地方丢失分数,例如:
>>> Fraction(1, 2) ** 4
Fraction(1, 16)
>>> Fraction(1, 2) ** 0.5
0.7071067811865476
尽管在计算公式的上下文中,尝试以符号方式存储所有内容并没有多大意义。这让我们回到了粗略的 float
通常就足够好的想法。如果你真的想要某种 surd 输出格式,你可以试试 sympy
:
In [1]: from sympy import *
In [2]: sqrt(Integer(1) / Integer(2))
Out[2]: sqrt(2)/2
这当然会进一步降低您的速度。
关于Python Decimal 给出不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46074244/
我是 Python 编程的新手,最近我一直在学习数据类型的某些方面。正如我所读,decimal.Decimal() 方法创建了一个小数对象; decimal.Decimal.from_float()
这是我今天在 filmmaster.com: 遇到的错误 PicklingError: Can't pickle : it's not the same object as decimal.Decim
简单的问题 - 为什么 Decimal 类型定义这些常量?何必呢? 我正在寻找一个原因,为什么这是由语言定义的,而不是可能的用途或对编译器的影响。为什么首先把它放在那里?编译器可以像 Decimal.
我在用 Python 编码为 JSON 时遇到问题,特别是 decimal.Decimal 值。我正在使用它为 Google App Engine 应用程序输出 JSON。 为了避免 Python 中
我在 Django 项目中有一些 python 代码曾经可以正常工作。托管该项目的服务器丢失了,我不得不将代码复制到新服务器上。现在,我收到一个似乎毫无意义的错误。 我的一个 python 文件中包含
我发现生成具有特定数量 的 decimal.Decimal 数字的最佳方法 significant figures 是用来初始化下面的变量 kluge 的: import decimal THIS_I
我在应用空合并运算符时遇到以下错误。 private decimal _currentImpulseId; // ... later on used in public property getter
我想使用 decimal.Decimal 对转换后的数字字符串进行算术运算。无论转换后的数字字符串有多少小数,我都希望返回有两位小数。 在这种特殊情况下,为什么两位小数精度返回一位小数,为什么三位小数
我想使用 decimal.Decimal 对转换后的数字字符串进行算术运算。无论转换后的数字字符串有多少小数,我都希望返回有两位小数。 在这种特殊情况下,为什么两位小数精度返回一位小数,为什么三位小数
是什么导致 sum 始终为 null? object[] data = new object[] { 2.2M, 3m, 1, "string", true,
我似乎失去了很多 float 的精度。 例如我需要求解一个矩阵: 4.0x -2.0y 1.0z =11.0 1.0x +5.0y -3.0z =-6.0 2.0x +2.0y +5.0z =7.0
这个问题在这里已经有了答案: Why python decimal.Decimal precision differs with equable args? (2 个答案) 关闭 5 年前。 我知道
当我尝试转换 Task 时出现此错误至 decimal : Could not load file or assembly 'EntityFramework, Version=5.0.0.0, Cul
我听到有人说在 C# 中,大写十进制比小写十进制使用更多的内存,因为小写十进制被解析为小写十进制并且需要内存。 这是真的吗? 最佳答案 没有。 decimal 只是 System.Decimal 的别
我有一个对象,它是 dict、list、常规数据类型和 decimal.Decimal 的嵌套组合。我想用 PyMongo 将这个对象插入到 MongoDB 中。 PyMongo 拒绝插入 Decim
sdr 是我的 sqldatareader,我想检查小数类型的 curPrice 值是否为空。 inrec.curPrice = sdr.IsDBNull(7) ? (十进制?)空:sdr.GetDe
变量 'a' 的类型可以是 - int/float/decimal.Decimal(但不是字符串) 我想检查它是否是 decimal.Decimal 类型。 以下作品: import decimal
我正在使用一个在函数调用中使用一些十进制类型参数的库。但是我有 numpy.int32 类型变量。当我将它传递给函数调用时,出现以下错误: TypeError: conversion from num
考虑以下代码: public class DecimalWrapper { public static implicit operator DecimalWrapper
考虑以下代码: public class DecimalWrapper { public static implicit operator DecimalWrapper
我是一名优秀的程序员,十分优秀!