multiplexing voltage display

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.