最新版的python浮点数,四舍六入问题

进位问题,看了很多文章,有说python里是四舍六入,然后如果最后位数字是5,5后有有效数字则进位。这部分实验了下是对的。但是如果5后面没有有效数字,是舍是进,众说纷纭。有说5前是奇数舍,偶数进,等等。
我自己测试了一下,并不是这么简单。以下是我的测试(保留2位小数):
1.115 1.11 1.115 1.11 1.615 1.61 1.715 1.72
1.215 1.22 1.125 1.12 1.625 1.62 1.725 1.73
1.315 1.31 1.135 1.14 1.635 1.64 1.735 1.74
1.415 1.42 1.145 1.15 1.645 1.65 1.745 1.75
1.515 1.51 1.155 1.16 1.655 1.66 1.755 1.75
1.615 1.61 1.165 1.17 1.665 1.67 1.765 1.76
1.715 1.72 1.175 1.18 1.675 1.68
1.815 1.81 1.685 1.69
1.915 1.92 1.695 1.70

请教下各位,看一下,这个进位的规则到底是怎么样的?

这种后面只有5的有这种结果正常,因为浮点数本身就是不精确存储的,看下面的代码就清楚了
如果要解决这个问题要么自己这样判断一下,要么看有没有什么库可以用的
可以去研究一下浮点数的存储结构

a1=1.110
a11 = 1.115
print(a11-a1)
print('1.115 %.2f\n' % (a11))

a2=1.210
a22 = 1.215
print(a22-a2)
print('1.215 %.2f\n' % (a22))

a3 = 1.310
a33 = 1.315
print(a33-a3)
print('1.315 %.2f\n' % (a33))

a4 = 1.410
a44 = 1.415
print(a44-a4)

运行结果是这样的,说明没有进1的是存储本身没有到达50.004999999999999893
1.115 1.11

0.0050000000000001155
1.215 1.22

0.004999999999999893
1.315 1.31

0.0050000000000001155
1.415 1.42

该回答内容部分引用GPT,GPT_Pro更好的解决问题
Python的进位规则按照IEEE 754标准(即四舍六入五考虑)来定义。

具体来说,如果小数位中最后一位是5,那么就要看前一位是奇数还是偶数。如果前一位是偶数,则舍去5;如果前一位是奇数,则进位5。

比如说:
11151.111115 舍去5 => 11151.111110
1.615 进位5 => 1.62
1.125 舍去5 => 1.12
1.725 进位5 => 1.73

以上就是Python浮点数进位规则的简单介绍。
如果回答有帮助,望采纳。

该回答引用ChatGPT

在 Python 中,浮点数的进位规则遵循 IEEE 754 标准,这是一种国际标准,也被其他大多数编程语言所采用。

根据 IEEE 754 标准,当要舍入的数字为5时,需要采用"银行家舍入规则",也就是说,采用最接近的偶数舍入。具体规则如下:

1、如果舍弃位的数值小于5,则直接舍弃。

2、如果舍弃位的数值大于5,则直接进位。

3、如果舍弃位的数值等于5,则需要判断舍弃位后面是否还有非零数值,如果有,则进位,否则采用最接近的偶数舍入。

根据你提供的测试结果,可以看出这个规则是正确的。例如,对于数字 1.115,舍弃位的数值为 5,后面紧随着一个 1,因此需要进位,结果为 1.12。对于数字 1.615,舍弃位的数值为 5,后面没有数字,但是 1.61 已经是一个偶数,因此需要舍入到最接近的偶数,结果为 1.62。

需要注意的是,由于浮点数的精度问题,可能会出现一些不同于预期的结果。因此,在进行精确计算时,建议使用 Decimal 类型或其他高精度计算库来进行计算。

python中的浮点数四舍六入问题,遵循IEEE 754标准,这是一种“最近舍入”的舍入模式。在最近舍入模式中,对于一个浮点数,它的舍入值为离该浮点数最近的可表示的浮点数。如果有两个可表示的浮点数离该浮点数同样接近,那么选择偶数位为零的浮点数。比如说,对于以下四个数进行四舍五入,结果如下:
1.5 舍入到 2
2.5 舍入到 2
3.5 舍入到 4
4.5 舍入到 4

Python的进位规则按照IEEE 754标准(即四舍六入五考虑)来定义。

具体来说,如果小数位中最后一位是5,那么就要看前一位是奇数还是偶数。如果前一位是偶数,则舍去5;如果前一位是奇数,则进位5。

在Python中,浮点数的四舍五入规则是遵循“银行家舍入法”(Banker's rounding),也称为“四舍六入五考虑”,即:

如果要舍弃的数字后面没有数字,则直接舍弃;
如果要舍弃的数字后面跟着一个数字,且该数字为奇数,则向上进位;
如果要舍弃的数字后面跟着一个数字,且该数字为偶数,则向下舍去。
根据这个规则,您的测试结果是正确的。例如,对于1.115,保留两位小数,第三位数字是5,而5后面没有其他数字,因此直接舍弃,得到1.11;对于1.215,保留两位小数,第三位数字是5,5后面跟着1,1是奇数,因此向上进位,得到1.22。

需要注意的是,在某些特殊情况下,由于浮点数的精度限制,可能会出现舍入误差。为了避免这种情况,建议使用Decimal类型进行精确计算。例如,可以使用Python内置的decimal模块中的Decimal类,或者使用第三方库如numpy中的np.round()函数进行四舍五入操作。

参考GPT和自己的思路,Python 浮点数的进位规则,遵循 IEEE 754 标准。根据这个标准,当要舍入的数字恰好为 5 时,有以下几种情况:

舍入到最接近的偶数。这种情况下,如果要舍入的数字前面是偶数,则直接舍去,如果是奇数,则进位。这种情况也被称为银行家舍入规则或者四舍六入五考虑。

舍入到最接近的数字。这种情况下,如果要舍入的数字前面是奇数,则进位,如果是偶数,则舍去。

在 Python 中,默认使用的是第一种舍入规则,即舍入到最接近的偶数。这也可以通过内置的 round() 函数来验证。

例如,对于要保留两位小数的数字 1.115,round() 函数将其舍入为 1.11,而对于数字 1.125,它将舍入为 1.12。

根据您提供的测试结果,我们可以看到舍入规则确实是舍入到最接近的偶数。例如,对于数字 1.515,它被舍入为 1.51,而对于数字 1.615,它被舍入为 1.61。在这两个例子中,要舍入的数字都是 5,但由于它们前面的数字分别是奇数和偶数,所以舍入结果不同。

需要注意的是,舍入规则只适用于最后一位数字是 5 的情况,其他数字的舍入规则遵循标准的四舍五入。