从0.0007中提取有效数字

时间:2018-11-12 12:29:10

标签: python digits

我想从XX=0.0007中提取7的有效数字

代码如下

XX=0.0007
enX1=XX//10**np.floor(np.log10(XX));

但是XX变成6而不是7。谁能帮我吗?

1 个答案:

答案 0 :(得分:1)

从某种意义上说,您很幸运以值0.0007开始。事实证明,该值是不能以浮点格式精确表示的(许多!)十进制值之一。

浮点数通常以2的幂的形式存储在公共IEEE-754 format中,就像整数(例如175)存储为具有2的幂的值增加的位之和一样(165 = 128 + 32 + 4 + 1),分数存储为1/2的幂的和。这意味着可以精确存储值1 / 2、1 / 4和1/65536(及其值之和,例如3/4),但是您的0.0007不能 。其最接近的值实际上是0.0000699999999999999992887633748495。 (“最接近”的含义是,在末尾仅再添加一个一位将使其比 0.0007稍大,并且相差也比该更低的一位稍大。)

在计算中,您使用双斜杠//,该斜杠指示Python进行整数除法并舍弃小数部分。因此,尽管中间计算是正确的,并且您得到类似6.99999...的信息,但它会被截断 ,最终得到6

如果使用斜杠,结果将保留其(精确!)小数,但Python将表示7.0000,并给出或采用几个零。默认情况下,Python仅显示少量的小数。

请注意,这仍然“不是”确切的值7。计算从一个不精确的数字开始,尽管可能会在此四处进行四舍五入,但最终得到 precise 整数的可能性很小。同样,不是所有小数,而是大量小数。其他分数值可能会比您输入的值(0.0004,例如 a )分数存储更大,但那里也存在准确性的基本“问题” 。只是不如您所见。

如果要得到最接近的整数结果,请使用一个单斜杠进行精确计算,然后使用round将数字强制为最接近的整数。

a 准确地说,大约是0.000400000000000000019168694409544。在执行完例行程序后,Python会将显示4,但从内部看,它仍然略大于该值。