什么规则规定Python浮点数是如何舍入的?

时间:2014-10-27 16:55:52

标签: python floating-point

关于浮动状态的Python文档

  

0.1

     

0.1000000000000000055511151231257827021181583404541015625

     

这比大多数人认为有用的数字更多,所以Python保留了   通过显示舍入值代替

可管理的位数      

0.1

有哪些规则可以围绕哪些花车进行展示以及哪些花花絮不显示?我遇到了一些有趣的场景

1.1 + 2.2返回3.3000000000000003(未接地)

但是

1.0 + 2.3返回3.3(舍入)

我知道十进制模块的存在是为了使这些事情保持一致,但我很好奇是什么决定了浮动中显示的舍入。

1 个答案:

答案 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。结果:

  1. 只有一个浮点值打印为3.3。不能有两个,因为它们必须通过定义的应用是相同的,并且至少有一个因为如果你将十进制表示3.3转换为double,你得到一个double当使用相关算法转换为十进制时,它具有产生字符串“3.3”的属性。

  2. 将值舍入为了显示十进制数字,但它们仍然是它们的数字。因此,您要求的一些“规则”是关于如何舍入浮点运算的规则。这很简单,但你必须look at the binary representation of the arguments and results才能简单。如果查看十进制表示,则舍入看起来是随机的(但事实并非如此)。

  3. 数字只有二进制的紧凑表示。确切的值可能需要许多十进制数字才能准确表示。 “3.3000000000000003”不是“未接地”,它简单地舍入到比“3.3”更多的数字,具体而言,恰好是区分该双精度数与其邻居所需的数字位数(由“3.3”表示的数字) )。它们实际上分别是以下数字:

  4. 3.29999999999999982236431605997495353221893310546875
    3.300000000000000266453525910037569701671600341796875
    

    在这两者中,33/10最接近前者,因此前者可以打印为“3.3”。后者不能打印为“3.3”,也不能打印为“3.30”,“3.300”,......,“3.300000000000000”,因为所有这些表示都是等效的,并解析回浮点数3.29999999999999982236431605997495353221893310546875。所以它必须打印为“3.3000000000000003”,其中3是因为数字2后跟6而获得。