Python 按特定数字进行浮点精度比较

Python 按特定数字进行浮点精度比较,python,math,rounding,Python,Math,Rounding,如何测试两个浮点数在指定数字之前是否相同 我试过了 aa1 = 0.043403 aa2 = 0.043392 print(int(aa1*1000) == int(aa2*1000)) >> True 我想这样做,但我的数据包含NAN值,它无论如何都无法将其转换为intro。 我也试过数学,但很难 例如,我想保留到3位数,然后应用math.isclose aa3 = 0.013041 aa4 = 0.012545 aa6 = 0.012945 print(math.isclos

如何测试两个浮点数在指定数字之前是否相同

我试过了

aa1 = 0.043403
aa2 = 0.043392
print(int(aa1*1000) == int(aa2*1000))
>> True
我想这样做,但我的数据包含NAN值,它无论如何都无法将其转换为intro。 我也试过数学,但很难

例如,我想保留到3位数,然后应用math.isclose

aa3 = 0.013041
aa4 = 0.012545
aa6 = 0.012945

print(math.isclose(aa3, aa4, abs_tol = 0.0001))
>>Flase
print(math.isclose(aa3, aa5, abs_tol = 0.0001))
>>True
但我想在这两种情况下都是假的


任何简单的想法???

您可以使用AssertalPosteQual轻松实现 下面是代码

import unittest

unittest.TestCase.assertAlmostEqual(value1,valu2,decimalUpto)

在你的情况下,它可以是

unittest.TestCase.assertAlmostEqual(aa1 ,aa2 ,3)

祝你好运

创建一个包含两个数字的函数,
a
b
,并且它有一个预设的阈值。如果
a
b
之间的差值小于阈值,则返回True

def isSame(a, b):
    return abs(a - b) < treshold

我们忽略第三位数字后的每个数字,以防您的
数字=3

rel\u tol
足够:

import math

def check(a, b):
    print(math.isclose(a, b, rel_tol=0.001), abs(a/b - 1.) < 0.001)

check(aa1, aa2)
check(aa3, aa4)
check(aa3, aa6)

注意:第二次计算不处理两个相等的零:易于添加。不确定下溢是否会影响它。

您想测试数字的四舍五入值(最多3位)还是仅在3位之后剪切?我只想在3位之后忽略它。您真的关心数字吗?否则“rel_tol”就足够接近了,但对于十进制数字,您需要转换为十进制,因此您应该转换为字符串并比较字符串[注意长度、点、指数,…]@GiacomoCatenazzi Yes。我需要具体的数字标准从您对其他答案的评论判断,我认为您对python浮点类型有一个基本的误解。虽然没有强制要求,但您会发现python的每个实现都使用IEEE 754二进制浮点类型。这些类型没有以10为基数的数字,而是以2为基数的数字。因此,在这些浮点类型中没有.1这样的值。您下面的注释“…0.0014,0.001399,threshold=0.00001。应为False…”是有问题的,因为这些值都不存在于浮点类型中。建议您考虑<代码>十进制< /代码>模块。它会导致错误属性错误:“浮动”对象没有属性“*格式消息”,您必须在类中使用它。有很多例子,看看它们,我可能会错误计算treshold值。但你明白了。这是我的问题:/对我来说很有用。你的意思是浮点数后3位,还是浮点数前带前导0?哦,对不起,试试这个0.0014,0.001399,阈值=0.00001。应该是假的,但返回真的我看到了你的问题。这个函数表示True,因为这些数字基本上是相同的。你需要的是把第三位数字后的数字剪掉。我马上发布最新消息。
import math

def check(a, b):
    print(math.isclose(a, b, rel_tol=0.001), abs(a/b - 1.) < 0.001)

check(aa1, aa2)
check(aa3, aa4)
check(aa3, aa6)
True True
False False
False False