提问人:Lnio Yarschov 提问时间:10/11/2023 更新时间:10/11/2023 访问量:48
如何检查“地板”值和另一个值的有效数字是否相同?
How would I check if the significant digits of a "floored" value and another value are the same?
问:
假设一个值在显示时是“下限”(以某个任意数字下限)(7.785->7.7、110.6->110)。将这个底值称为 。假设我有另一个名为 的数字变量。如何检查 和 的有效数字是否相等?flooredTarget
toCheck
flooredTarget
toCheck
注意:第一个参数是 。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())
答:
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
评论
toFixed()