谁能解释模运算符在Python中如何工作?我不明白为什么3.5 % 0.1 = 0.1
。
其实,这是不正确的3.5 % 0.1是0.1。你可以很容易地测试一下:
>>> print(3.5 % 0.1)
0.1
>>> print(3.5 % 0.1 == 0.1)
False
实际上,在大多数系统上3.5 % 0.1
是0.099999999999999811
。但是,在某些版本的Python上str(0.099999999999999811)
是0.1
:
>>> 3.5 % 0.1
0.099999999999999811
>>> repr(3.5 % 0.1)
'0.099999999999999811'
>>> str(3.5 % 0.1)
'0.1'
现在,你可能想知道为什么3.5 % 0.1
是0.099999999999999811
而不是0.0
。这是由于通常的浮点舍入问题。如果你还没有阅读每位计算机科学家应该知道的有关浮点运算的知识,那么你应该-至少是Wikipedia
对此问题的简要概述。
还需要注意的是3.5/0.1不是34,它的35。那么,3.5/0.1 * 0.1 + 3.5%0.1是3.5999999999999996,这是不甚至接近到3.5。这对于模数的定义非常重要,在Python和几乎所有其他编程语言中都是错误的。
但是Python 3在那里抢救了。大多数了解的人都知道//这是你如何在整数之间进行“整数除法”,但没有意识到这是你如何在任何类型之间进行模数兼容的除法。3.5//0.1
是34.0
,因此3.5//0.1 * 0.1 + 3.5%0.1
是(至少内的一个小的舍入误差)3.5。它已被反向移植到2.x,因此(取决于你的确切版本和平台),你也许可以依靠此。而且,如果没有,则可以使用divmod(3.5, 0.1)
,它返回(在舍入误差内)(34.0, 0.09999999999999981)
一直回到时间的迷雾中。当然,你仍然希望这是(35.0, 0.0)
,而不是(34.0, almost-0.1)
,但是由于舍入错误,你不能拥有它。
如果你正在寻找快速修复,请考虑使用以下Decimal类型:
>>> from decimal import Decimal
>>> Decimal('3.5') % Decimal('0.1')
Decimal('0.0')
>>> print(Decimal('3.5') % Decimal('0.1'))
0.0
>>> (Decimal(7)/2) % (Decimal(1)/10)
Decimal('0.0')
这不是魔术般的灵丹妙药-例如,每当操作的确切值在基数10中不能有限地表示时,你仍然必须处理舍入错误-但是舍入错误与人类直觉期望的情况更好地对齐有问题。(Decima
lover的另一个优点float是,你可以指定显式精度,跟踪有效数字等,并且在从2.4到3.3的所有Python版本中实际上都是相同的,而有关详细信息同时float
已更改了两次。但是,当你事先知道所有数字都可以精确地以10为基数表示,并且它们不需要的位数比你配置的精度高时,它就会起作用。
问题内容: 我很困惑为什么在这种情况下python为什么要添加一些额外的十进制数,请帮助解释 问题答案: 浮点数是一个近似值,它们不能精确存储十进制数。因为它们试图仅用64位表示很大范围的数字,所以它们必须在某种程度上近似。 意识到这一点非常重要,因为它会导致一些怪异的副作用。例如,你可能会非常合理认为,十批的总和会。尽管这似乎合乎逻辑,但在浮点数方面也是错误的: 您可能会认为。浮点世界再次不同意
在编程语言中,小数通常以浮点数的形式存储。浮点数和定点数是相对的:小数在存储过程中如果小数点发生移动,就称为浮点数;如果小数点不动,就称为定点数。 如果你对浮点数的底层存储格式不了解,请猛击:小数在内存中是如何存储的,揭秘诺贝尔奖级别的设计(长篇神文) Python 中的小数有两种书写形式: 1) 十进制形式 这种就是我们平时看到的小数形式,例如 34.6、346.0、0.346。 书写小数时必须
问题内容: 我正在读取一个带有浮点数的文本文件,这些数字都带有1或2个小数点。我正在使用将线转换为浮点数,并在失败的情况下引发。我将所有花车存储在列表中。打印时,我想将其打印为2个小数位的浮点数。 假设我有一个文本文件,其编号为-3,65、9,17、1。我阅读了每个文件,然后将它们转换为float并将它们附加到列表中。现在在Python 2中,调用return 。但是在Python 3中,-3.6
问题内容: 我不知道这是否是一个明显的错误,但是在运行Python脚本以更改模拟参数时,我意识到缺少和的结果。在调查中,我注意到以下Python代码: 生成的相同文件的增量= 0.28和0.29,与.57和.58相同,原因是python返回float(29)/ 100为。但这不是系统错误,从某种意义上说,它并不是每个整数都发生的。因此,我创建了以下Python脚本: 而且我看不到发生这种舍入错误的
问题内容: 我正在尝试删除列表中为负的浮点值。具有所有值的原始列表如下所示: 在我运行一个循环之后,显示列表如下所示: 因此,某些负面信息,例如被删除,而其他则没有。为什么是这样? 问题答案: 您正在遍历列表并对其进行变异,这意味着您最终删除了错误的元素,可以使用reversed: 或制作副本: 您还可以使用列表组件来修改原始列表:
对于精度很重要的用例,推荐使用Python的本机浮点实现还是十进制实现? 我认为这个问题很容易回答:如果累积误差具有重要意义,例如可能在计算轨道轨迹等方面,那么一个精确的表示可能更有意义。 null