there is a very annoying flicker b
Because your code does that.
What you should have done is to calculate the right segment information, send them to the hc595, and then latch. This will cause the display to be updated instantaneously, no flickering at all. Like this:
//get the right number to volts
unsigned short voltsx10 = volts * 10; //convert volts to a fixed point integer
tenths = voltsx10 % 10; voltsx10 /= 10;
ones = voltsx10 %10; voltsx10 /=10;
tens = voltsx10 %10;
//check for blanks
if (tens==0) tens = BLANK;
if ((tens == BLANK) || (ones == 0) ones = BLANK;
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, LSBFIRST, segdisp[tenths]); // clears the right display
shiftOut(datapin, clockpin, LSBFIRST, segdisp[ones]); // clears the left display
shiftOut(datapin, clockpin, LSBFIRST, segdisp[tens]); // clears the left display
digitalWrite(latchpin, LOW);
This will blank out leading zeros and will not cause any flickering.
You really should avoid the use of floating point math also.