如何检查“地板”值和另一个值的有效数字是否相同?

How would I check if the significant digits of a "floored" value and another value are the same?

提问人:Lnio Yarschov 提问时间:10/11/2023 更新时间:10/11/2023 访问量:48

问:

假设一个值在显示时是“下限”(以某个任意数字下限)(7.785->7.7、110.6->110)。将这个底值称为 。假设我有另一个名为 的数字变量。如何检查 和 的有效数字是否相等?flooredTargettoCheckflooredTargettoCheck

注意:第一个参数是 。flooredTarget

checkSignificant(7.7, 7.785); // true as 7.7 is common
checkSignificant(7.785, 7.8); // false as toCheck doesn't contain 7.785

我应该检查一下吗?或者有没有其他更好的方法(假设任何语言)toCheck.toString().beginsWith(flooredTarget.toString())

JavaScript Python 数学 数字

评论

1赞 Goku - stands with Palestine 10/11/2023
假设任何语言...
0赞 mykaf 10/11/2023
在检查相等性之前,类似于 JavaScript 中的东西?toFixed()

答:

0赞 Konrad 10/11/2023 #1

您可以使用正则表达式

function checkSignificant(flooredTarget, toCheck) {
  const [digits] = flooredTarget.toString().match(/(?<=\.)\d+/)
  return new RegExp(`(?<=\\.)${digits}`).test(toCheck.toString())
}

console.log(checkSignificant(7.7, 7.785));
console.log(checkSignificant(7.785, 7.8));

0赞 Spektre 10/11/2023 #2

转换为文本是性能杀手,还有其他方法,例如我在 C++ 中看到它:

//---------------------------------------------------------------------------
double align_to_exp(double x,int e) // align number x so its most significant digit is at 10^e weight
    {
    bool sig=false;
    if (x==0.0) return 0.0;         // special case
    if (x<0.0){ sig=true; x=-x; }   // ignore sign
    x*=pow(10,e-floor(log10(x)));   // shift digit positions to 10^e
    if (sig) x=-x;                  // restore sign
    return x;
    }
//---------------------------------------------------------------------------
int count_equal_digits(double a,double b) // return number of common significant digits between a,b or -1 if both are zero
    {
    int i;
    double aa,bb;
    a=align_to_exp(fabs(a),0);      // align numbers to 10^0
    b=align_to_exp(fabs(b),0);
    if ((a==0.0)&&(b==0.0)) return -1;  // special case
    for (i=0;i<17;i++)              // limit to 17 digits for double
        {
        aa=floor(a);                // aa is compared digit
        bb=floor(b);                // bb is compared digit
        if ((aa!=bb)||(a==0.0)||(b==0.0)) break;    // stop on difference
        a-=aa; a*=10.0;             // move to next digit
        b-=bb; b*=10.0;             // move to next digit
        }
    return i;
    }
//---------------------------------------------------------------------------

仍然有很大的改进空间,比如让早午餐变得无,但在这种形式下,代码更容易理解。align_to_exp