;helper function for formatannotation.pro ;checks if rounding will add a digit to double format ; lphilpott 6-mar-2012 ; When changes are made to this routine cases that have caused problems in the past should be rechecked ; eg. 1. Page Options margin spinners: 1.65 should be displayed as '1.65' not ' 1.65' or '1.6499999' ; 2. Plotting thd_peif_density for 2007-03-23 the highest default y axis tick is 10^4. Make sure it doesn't display as '******' pro check_dround, val, neg, dec, precision compile_opt idl2, hidden ;get string of digit to be rounded z = val * 10d^precision ; NB: this doesn't always give the result you might expect ; eg. you might find that if z=6000.0 z_frac =0.99999999999909 z_frac = abs(z mod 1.0) ; this is an attempt to avoid the problem described above ; we are really only interested in the first decimal place anyway - removing this because it causes other problems ; z_frac = float(z_frac) ;if finite(z_frac) && z_frac gt .5 then dec++ if finite(z_frac) && z_frac gt .5 then begin ; number will be rounded y = round(abs(z),/l64); in case we are dealing with something that can't be fit in 32bit integer ; only increase if rounding increases order of magnitude ; NB if abs(val) is less than 0 then number of digits left of decimal won't increase ; ie. 0.99 rounds to 1 but both have 1 digit left of decimal if (floor(alog10(y)) gt floor(alog10(abs(z)))) && abs(val) ge 1 then begin dec++ ; the case below is to catch particular cases where the calculation of floor(alog10(abs(z)))3 ; ends up rounding it eg. val = -9.9999999999999 with precision = 12 could otherwise ; close with dec=1 endif else if floor(alog10(abs(z))) gt (floor(alog10(abs(val))) + precision) then dec++ endif ; if z lt 0 then return ; zs = strtrim(string(z, format='(D255.1)'),1) ; zs1 = strmid(zs,strlen(zs)-3,1) ; ; ;add length if rounding increases order of magnitude ; if is_numeric(zs1) then begin ; if double(zs1) ge 5 then begin ; i = neg ? -1:1 ; if floor(alog10(abs( val +i*10d^(-precision) ))) ge dec then dec++ ; endif ; endif end