关于浮动状态的Python文档
0.1
0.1000000000000000055511151231257827021181583404541015625
这比大多数人认为有用的数字更多,所以Python保留了 通过显示舍入值代替
可管理的位数0.1
有哪些规则可以围绕哪些花车进行展示以及哪些花花絮不显示?我遇到了一些有趣的场景
1.1 + 2.2返回3.3000000000000003(未接地)
但是
1.0 + 2.3返回3.3(舍入)
我知道十进制模块的存在是为了使这些事情保持一致,但我很好奇是什么决定了浮动中显示的舍入。
答案 0 :(得分:3)
围绕哪些浮动显示圆形的规则是什么 哪些不?
我遇到了一些有趣的场景1.1 + 2.2返回3.3000000000000003(未接地)
但
1.0 + 2.3返回3.3(舍入)
部分解释当然是1.1 + 2.2和1.0 + 2.3产生不同的浮点数,而 的部分解释是1.1实际上不是11 / 10,2.2不是真的22/10,当然浮点+
也不是理性的补充。
许多现代编程语言,包括最新的Python变体,在显示双精度浮点值d
时,精确显示十进制表示所需的小数位数,重新解析作为double
,再次转换为d
。结果:
只有一个浮点值打印为3.3。不能有两个,因为它们必须通过定义的应用是相同的,并且至少有一个因为如果你将十进制表示3.3转换为double
,你得到一个double
当使用相关算法转换为十进制时,它具有产生字符串“3.3”的属性。
将值舍入为了显示十进制数字,但它们仍然是它们的数字。因此,您要求的一些“规则”是关于如何舍入浮点运算的规则。这很简单,但你必须look at the binary representation of the arguments and results才能简单。如果查看十进制表示,则舍入看起来是随机的(但事实并非如此)。
数字只有二进制的紧凑表示。确切的值可能需要许多十进制数字才能准确表示。 “3.3000000000000003”不是“未接地”,它简单地舍入到比“3.3”更多的数字,具体而言,恰好是区分该双精度数与其邻居所需的数字位数(由“3.3”表示的数字) )。它们实际上分别是以下数字:
3.29999999999999982236431605997495353221893310546875 3.300000000000000266453525910037569701671600341796875
在这两者中,33/10最接近前者,因此前者可以打印为“3.3”。后者不能打印为“3.3”,也不能打印为“3.30”,“3.300”,......,“3.300000000000000”,因为所有这些表示都是等效的,并解析回浮点数3.29999999999999982236431605997495353221893310546875。所以它必须打印为“3.3000000000000003”,其中3是因为数字2后跟6而获得。