首先,在大多数编程语言中,像 “1.55” 这样未经装饰的常量会被视为双精度值。然而,1.55 无法精确地表示为双精度值,因为它在二进制表示中没有终止的表示形式。这会导致许多奇怪的行为,但其中一个效果是,当您键入 1.55 时,您实际上并没有得到恰好介于 1.5 和 1.6 之间的值。
在二进制中,十进制数 1.55 是:
1.10001100110011001100110011001100110011001100110011001100110011001100...
当你输入"1.55"时,这个值实际上会被四舍五入为最接近的可表示双精度浮点数(在许多系统上...但也有例外情况,我将在后面讨论)。这个值是:
1.1000110011001100110011001100110011001100110011001101
这个数略微大于1.55;用小数表示,它确切地是:
1.5500000000000000444089209850062616169452667236328125
当被要求将此值舍入到小数点后一位时,它会向上舍入为1.6。这就是为什么大多数评论者说他们无法复制您看到的行为。
但是,在您的系统上,“1.55”向下舍入而不是向上。发生了什么?
可能有几种不同的情况,但最有可能的是您正在使用采用x87指令进行浮点运算的平台(可能是Windows),该指令使用不同的(80位)内部格式。 在80位格式中,1.55的值为:
1.100011001100110011001100110011001100110011001100110011001100110
这个数字略小于1.55,用十进制表示是:
1.54999999999999999995663191310057982263970188796520233154296875
因为它小于1.55,所以当它被舍入到小数点后一位时会向下舍入,这就是你观察到的结果"1.5"。
FWIW:在大多数编程语言中,默认的舍入模式实际上是“四舍五入到最近的偶数”,只是当您在十进制中指定分数值时,您几乎永远不会遇到精确的中间情况,因此对于普通人来说很难观察到这一点。但是,如果您查看将“1.5”舍入为零位数的方式,就可以看到它。
>>> "%.0f" % 0.5
'0'
>>> "%.0f" % 1.5
'2'
请注意,这两个值都会四舍五入为
偶数;没有一个会四舍五入为 "1"。
编辑:在您修改的问题中,似乎已经切换到另一个Python解释器,在该解释器上,浮点数采用IEEE754双精度类型而不是x87 80位类型。因此,“1.55”向上四舍五入,就像我的第一个例子一样,但“5.55”转换为以下二进制浮点值:
101.10001100110011001100110011001100110011001100110011
就是:
5.54999999999999982236431605997495353221893310546875
以十进制计算;因为这个数字比5.55小,所以它会向下取整。