修正pandas中四舍五入时浮点运算“错误”

2024-06-01 09:55:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个我讨厌的号码(我肯定还有其他号码)。在

是的

a17=0.0249999999999999
a18=0.02499999999999999

案例1:

^{pr2}$

案例2:

round(a17,3)=round(a18,3)=0.025

案例3:

round(round(a17,3),2)=round(round(a18,3),2)=0.03

但当这些数字在数据框中时。。。在

案例4:

df=pd.DataFrame([a17,a18])

np.round(df.round(3),2)=[0.02, 0.02]

为什么我得到的答案与案例1中的答案相同?在


Tags: 数据答案dataframedfnp数字案例号码
1条回答
网友
1楼 · 发布于 2024-06-01 09:55:14

当您使用浮动时,您将无法获得精确的值,但在大多数情况下只能近似值。因为浮点的内存组织。在

你应该记住小数点印刷的时候,你应该记住!!!
这是不一样的。在

精确值在0.xxxx中“.”后面只有17位数字

这就是为什么:

>>> round(0.0249999999999999999,2)
0.03
>>> round(0.024999999999999999,2)
0.02

<>这对于大多数编程语言(FORTRAN、Python、C++等)

是正确的。

让我们看看Python文档的片段:

https://docs.python.org/3/tutorial/floatingpoint.html

0.0001100110011001100110011001100110011001100110011...

停在任何有限位数,你就得到了一个近似值。在今天的大多数机器上,浮点数是用二进制分数来近似的,分子使用前53位,从最高有效位开始,分母是2的幂次方。在1/10的情况下,二进制分数为3602879701896397/2**55,接近但不完全等于1/10的真值。在

由于值的显示方式,许多用户不知道近似值。Python只打印机器存储的二进制近似值的十进制近似值。在大多数机器上,如果Python要打印存储为0.1的二进制近似值的真正的十进制值,它必须显示

>>>0.1
0.1000000000000000055511151231257827021181583404541015625

这比大多数人认为有用的位数要多,因此Python通过显示舍入值来保持位数的可管理性

>>>1 / 10
0.1

请记住,即使打印的结果看起来像1/10的精确值,实际存储的值是最接近的可表示的二进制分数。在

有趣的是,有许多不同的十进制数共享相同的近似二进制分数。例如,数字0.1和0.1000000000000001和0.100000000000000551151312257827021181583404541015625均由3602879701896397/2**55近似。由于所有这些十进制值都具有相同的近似值,因此可以显示其中任何一个值,同时仍保持不变的eval(repr(x))==x

让我们看看NumPy文档的片段:

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.around.html#numpy.around
为了理解-np.圆形使用np.周围-参见NumPy文档

For values exactly halfway between rounded decimal values, NumPy rounds to the nearest even value. Thus 1.5 and 2.5 round to 2.0, -0.5 and 0.5 round to 0.0, etc. Results may also be surprising due to the inexact representation of decimal fractions in the IEEE floating point standard [R9] and errors introduced when scaling by powers of ten.

结论:

对你来说np.圆形根据上面描述的规则,刚刚将0.025修约为0.02(来源:NumPy文档)

相关问题 更多 >