当前位置: 首页 > 面试题库 >

确定四舍五入为n个有效十进制数字时两个数字是否几乎相等的函数

酆景辉
2023-03-14
问题内容

我被要求测试第三方提供的图书馆。该库已知可精确到 n个 有效数字。任何不太重要的错误都可以安全地忽略。我想编写一个函数来帮助我比较结果:

def nearlyequal( a, b, sigfig=5 ):

此函数的目的是确定两个浮点数(a和b)是否近似相等。如果a == b(完全匹配),或者当a和b具有十进制值的 sigfig 有效数字舍
入时, 该函数将返回True 。

有人可以建议一个好的实施方案吗?我写了一个迷你单元测试。除非您在测试中看到错误,否则良好的实现应通过以下内容:

assert nearlyequal(1, 1, 5) 
assert nearlyequal(1.0, 1.0, 5) 
assert nearlyequal(1.0, 1.0, 5) 
assert nearlyequal(-1e-9, 1e-9, 5) 
assert nearlyequal(1e9, 1e9 + 1 , 5) 
assert not nearlyequal( 1e4, 1e4 + 1, 5) 
assert nearlyequal( 0.0, 1e-15, 5 ) 
assert not nearlyequal( 0.0, 1e-4, 6 )

补充说明:

  1. 值a和b的类型可能是int,float或numpy.float64。值a和b将始终是同一类型。至关重要的是,转换时不要在函数中引入其他错误。
  2. 让我们保持此数值不变,因此转换为字符串或使用非数学技巧的函数并不理想。该程序将由数学人员审核,该数学人员希望能够证明该功能已完成预期的功能。
  3. 速度…我必须比较很多数字,所以速度越快越好。
  4. 我有numpy,scipy和标准库。我很难获得其他任何东西,尤其是对于项目的一小部分。

问题答案:

有一个函数assert_approx_equalnumpy.testing(源在这里)这可能是一个很好的起点。

def assert_approx_equal(actual,desired,significant=7,err_msg='',verbose=True):
    """
    Raise an assertion if two items are not equal up to significant digits.

    .. note:: It is recommended to use one of `assert_allclose`,
              `assert_array_almost_equal_nulp` or `assert_array_max_ulp`
              instead of this function for more consistent floating point
              comparisons.

    Given two numbers, check that they are approximately equal.
    Approximately equal is defined as the number of significant digits
    that agree.


 类似资料:
  • 问题内容: 如何在Java中四舍五入到特定的倍数?在excel中,该函数可以轻松舍入到指定的倍数,如下所示: 所以将返回,如果和如果。 到目前为止,我发现的所有舍入函数都始终舍入到最接近的整数或指定的小数位数,但是我希望能够为每个变量更改倍数。有谁知道哪种功能最适合这种情况? 问题答案: 只需除以数字,四舍五入,然后乘以数字即可。

  • 问题 你想对浮点数执行指定精度的舍入运算。 解决方案 对于简单的舍入运算,使用内置的 round(value, ndigits) 函数即可。比如: >>> round(1.23, 1) 1.2 >>> round(1.27, 1) 1.3 >>> round(-1.27, 1) -1.3 >>> round(1.25361,3) 1.254 >>> 当一个值刚好在两个边界的中间的时候, round

  • 问题内容: 我需要四舍五入才能在UI中显示。例如,一个重要的数字: 1234-> 1000 0.12-> 0.1 0.012-> 0.01 0.062-> 0.06 6253-> 6000 1999-> 2000 是否有使用Python库执行此操作的好方法,还是必须自己编写? 问题答案: 您可以使用负数舍入整数: 因此,如果您只需要最高有效数字: 如果大于1,则可能需要将float转换为整数。

  • 问题内容: 我希望能够在SQL中将数字四舍五入为n个有效数字。所以: 我知道ROUND()函数可以四舍五入到小数点后n位而不是有效数字。 问题答案: 应该做的把戏! 成功测试了您的两个示例。 编辑:在@ number = 0上调用此函数将不起作用。在使用此代码之前,您应该为此添加一个测试。

  • 我正在尝试用Java对BigDecimal进行四舍五入。下面是我执行的代码 因此,对于我的使用情形,输出为prec1 = 49.32和prec2 = 49.33,我需要始终舍入到49.33,那么除了设置两次比例之外,还有其他舍入到49.33的方法吗?

  • 问题内容: 这有效但是没有小数位 文件说 我尝试了这个但是得到这个错误: 如何将数据框中的所有元素四舍五入到小数点后两位? [编辑]弄清楚了。 问题答案: