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 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More