gpt4 book ai didi

python - 小数精度在同一数据集上的工作方式不同

转载 作者:行者123 更新时间:2023-11-28 17:56:00 26 4
gpt4 key购买 nike

我目前正在尝试将一组数据的标准偏差四舍五入到小数点后第六位。

Python round() 没有像我希望的那样工作,因为有些数字显示得很奇怪。例如,我的意思是 0.013931 显示为 0.013931099999999998。我通过使用 Decimal 并将上下文精度设置为 5 解决了问题的要点,但现在一些标准偏差显示为四舍五入到小数点后第 6 位,而其他标准差则四舍五入到小数点后第 7 位!

from decimal import *

getcontext().prec = 4
getcontext().rounding = ROUND_HALF_UP

print(Decimal(0.005855795678472189)/10)
print(Decimal(0.013931099999999998)/10)

我预计输出是 0.00058558 和 0.0013931,但实际输出是 0.0005856 和 0.001393,它们的长度不同!

最佳答案

decimal 包中的精度应用于 float 的小数部分。也就是说,在科学记数法中,如果您设置 getcontext().prec = 4,您将始终看到 4 位数字,就像这样

>>> print(Decimal(0.005855795678472189)/10)
0.0005856
>>> print(Decimal(0.0005855795678472189)/10)
0.00005856
>>> print(Decimal(0.00005855795678472189)/10)
0.000005856
>>> print(Decimal(0.000005855795678472189)/10)
5.856E-7
>>> print(Decimal(0.0000005855795678472189)/10)
5.856E-8
>>> print(Decimal(0.00000005855795678472189)/10)
5.856E-9
>>> print(Decimal(0.000000005855795678472189)/10)
5.856E-10

注意 float 是分三部分存储的

  • 第一位是符号(加/减),
  • 接下来的几位是指数部分。 (这是遵循 64 位 IEEE 754 标准的 float 中的 11 位。这包括 C++ double 和 python float。指数部分是二进制科学记数法指数 -1023,因此我们可以在 e-1024 之间得到数字指数部分为 0(全为零),如果指数部分为 2**11-1=2047(全为 1)则为 e+1023。)
  • 剩下的位是小数部分。

The wikipedia article有详细信息。

关于python - 小数精度在同一数据集上的工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58396724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com