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

Igor Pro 8

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More