一组浮点数

时间:2018-09-25 07:38:30

标签: python floating-point set compare

因此,我想创建一组浮点数,其中在给定一定的公差的情况下,两个数被视为相等。例如,如果我有一套

GameState gs;

void initialize_mines() {
    for (int i =0; i < NUM_TILES_X; i++) {
        for (int j =0; j < NUM_TILES_Y; j++) {
            gs.tiles[i][j].revealed = false;
        }
    }
}

如果我添加公差为1e-4的元素1.00001,则结果集应为

a =  set([1, 2, 3])

而不是

{1, 2, 3}

3 个答案:

答案 0 :(得分:5)

我们可以使用取整功能来检查tolerance of 1e-4

a = set([1,2,3])
def add(number):
  if(round(number,4) not in a):
    a.add(number)


add(1)
print(a)
add(1.0000)
print(a)
add(1.0001)
print(a)
add(1.1)
print(a)

答案 1 :(得分:4)

在我看来,您应该只能够检查该集中的每个项目,并且,如果该项目与您要添加的项目之间的绝对差小于阈值,请不要添加它

类似这样的事情应该可以解决:

def AddToSetWithThreshold(pSet, pValue, pThreshold):
    vList = [entry for entry in pSet if abs(pValue - entry) < pThreshold]
    if len(vList) == 0:
        pSet.add(pValue)

a = set([1, 2, 3]) ; print(a)
AddToSetWithThreshold(a, 1.00001, 1e-4) ; print(a)
AddToSetWithThreshold(a, 1.00001, 1e-6) ; print(a)

因为第一个加法太接近1,而第二个加法不是 ,这将导致以下输出:

set([1, 2, 3])
set([1, 2, 3])
set([1, 2, 3, 1.00001])

答案 2 :(得分:0)

导入数学并使用ceil

import math

decimals = 3

v = 1.234566789
print(math.ceil(v*pow(10,decimals))/pow(10,decimals))  
# 1.234

或者如果您想要整数(例如“阈值”),请使用

print(float(int(v)))
# 1.0