我正在使用Igor Pro (我不经常使用它)。我正在尝试计算小数点右边的位数,如果有的话,对于一个波。然后将小数位加到第二个波的左边,不管在第一波中有多少位。作为参考,我附上了一张我目前拥有的照片。"test_correct“是它应该看起来的样子,而"fix_err”是我当前输出的内容。我在这方面已经有一段时间了,但似乎不能弄明白,任何帮助都将不胜感激。谢谢example
Function testErrFix()
wave test_energy, test_err
variable i, j, s
variable len = numpnts(test_energy)
make/O/D/N=(len) fix_err
string current_Energy
string current_Err
string Error
variable slen
For(i=0;i<len;i+=1)
current_Energy = num2str(test_energy[i])
current_Err = num2str(test_err[i])
slen = strlen(current_energy)
Error = ""
For(j=0;j<slen;j+=1)
If(Stringmatch(current_Energy[j], ".")==1)
For(s=j;s<slen;s+=1)
Error += "." + current_Err[s-4] + current_Err[s-3] + current_Err[s-2]
EndFor
ElseIf(Stringmatch(current_Energy[j], "")==1)
Error += current_Err[s+1]
For(s=j;s<slen;s+=1)
Error = current_Err[s]
EndFor
EndIf
EndFor
fix_err[i] = str2num(Error)
EndFor
End发布于 2021-05-21 22:48:09
您的示例错误地使用了num2str。默认情况下,这只返回5位小数,请参阅其文档。您还可以调整表中显示的位数。
你能谈谈你想要实现的目标吗?到目前为止,我从来不需要知道小数点右边的位数。
编辑:小数位数取决于将数字转换为字符串的方式。因此,一般而言,这是行不通的。
一个朴素的实现
Function/S num2strHighPrec(variable num)
string str
sprintf str, "%.15f", num
return str
End
Function/S RemoveEndingExhaustive(string str, string ending)
string result
for(;;)
result = RemoveEnding(str, ending)
if(!cmpstr(result, str) || strlen(result) == 0)
return result
endif
str = result
endfor
End
Function CountDecimalPlaces(variable num)
string numAsStr
variable pos
numAsStr = num2strHighPrec(num)
numAsStr = RemoveEndingExhaustive(numAsStr, "0")
pos = strsearch(numAsStr, ".", 0)
if(pos < 0)
return 0
endif
return strlen(numAsStr) - 1 - pos
End可能是一个很好的起点。
https://stackoverflow.com/questions/67636933
复制相似问题