public ScaledView withUnitsPrecise(final String name, final ScaleUnits scaleUnits) {
        return new ScaledView(name, this::getElapsedNanos, scaleUnits.nanoRelativeDecimalShift);
    }
@Test
    public void withUnitsPrecise() {
        final ManualAdvanceClock clock = new ManualAdvanceClock(Instant.now());
        final UptimeMetric uptimeMetric = new UptimeMetric("up_millis", clock::nanoTime);
        clock.advance(Duration.ofNanos(123_456_789_987L)); // 123.xx seconds

        // set-up: ensure advancing nanos reflects in our milli-based uptime
        assertEquals(Long.valueOf(123_456L), uptimeMetric.getValue());

        final UptimeMetric.ScaledView secondsBasedView = uptimeMetric.withUnitsPrecise("up_seconds", UptimeMetric.ScaleUnits.SECONDS);
        final UptimeMetric.ScaledView millisecondsBasedView = uptimeMetric.withUnitsPrecise("up_millis", UptimeMetric.ScaleUnits.MILLISECONDS);
        final UptimeMetric.ScaledView microsecondsBasedView = uptimeMetric.withUnitsPrecise("up_micros", UptimeMetric.ScaleUnits.MICROSECONDS);
        final UptimeMetric.ScaledView nanosecondsBasedView = uptimeMetric.withUnitsPrecise("up_nanos", UptimeMetric.ScaleUnits.NANOSECONDS);

        assertEquals(new BigDecimal("123.456789987"), secondsBasedView.getValue());
        assertEquals(new BigDecimal("123456.789987"), millisecondsBasedView.getValue());
        assertEquals(new BigDecimal("123456789.987"), microsecondsBasedView.getValue());
        assertEquals(new BigDecimal("123456789987"), nanosecondsBasedView.getValue());

        clock.advance(Duration.ofMillis(1_999));
        assertEquals(Long.valueOf(125_455L), uptimeMetric.getValue());
        assertEquals(new BigDecimal("125.455789987"), secondsBasedView.getValue());
        assertEquals(new BigDecimal("125455.789987"), millisecondsBasedView.getValue());
        assertEquals(new BigDecimal("125455789.987"), microsecondsBasedView.getValue());
        assertEquals(new BigDecimal("125455789987"), nanosecondsBasedView.getValue());
    }