# Rounding values to a defined number of significant digits

This function uses the built-in 'round' function and exploits text search to temporary shift the decimal place. Just another example of more elaborate rounding. The output is the rounded value of the input, e.g. rounding 0.003474 to two digits yields 0.0035. Does currently not work correctly with negative inputs. But this would be easily implemented by separating out the sign.
Function SuperRound(number,digits)                   // round values to selectable number of digits
Variable number, digits

String StrNumber
Variable Multiplier, i                           // multiplier decides how much the decimal spot is "shifted" for rounding
if (number < 1)                              // separate numbers whether they are < or > 1
sprintf StrNumber, "%.10f", number           // express the number as text to work with it
for (i = 2; i < Strlen(StrNumber); i += 1)
if(StringMatch(StrNumber[i],"0") == 0)       // find the first non-zero number
Multiplier = 10^(2 - i - digits)
break
endif
endfor
else
sprintf StrNumber, "%d", number              // express the number as text to count the digits
Multiplier = 10^(strlen(StrNumber) - digits)
endif
if (Multiplier < 1)                          // countermeasure for rounding errors when dividing by small numbers
Multiplier = 1/Multiplier
number = round(number*Multiplier)/Multiplier
else
number = round(number/Multiplier)*Multiplier
endif
return number
End
Why not just let sprintf do the heavy lifting?

Function DoStuff(value, numSigDigits)
variable value, numSigDigits

string str

sprintf str, "%.*g\r", numSigDigits, value

return str2num(str)
End

``` print DoStuff(0.003474, 2) 0.0035 ```
I was somehow under the impression that str2num() is limited and wanted to avoid that function. But looking again only num2str() has limitations it seems. Of course there are elegant ways to round. My initial starting point was to exploit the round() function. One can see it as an example in number handling then.

Forum

Support

Gallery