diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig index 9bf7075d28..c36b474de9 100644 --- a/lib/std/fmt.zig +++ b/lib/std/fmt.zig @@ -2297,6 +2297,7 @@ test "float.decimal" { try expectFmt("f64: 0.00030000", "f64: {d:.8}", .{@as(f64, 0.0003)}); try expectFmt("f64: 0.00000", "f64: {d:.5}", .{@as(f64, 1.40130e-45)}); try expectFmt("f64: 0.00000", "f64: {d:.5}", .{@as(f64, 9.999960e-40)}); + try expectFmt("f64: 10000000000000.00", "f64: {d:.2}", .{@as(f64, 9999999999999.999)}); } test "float.libc.sanity" { diff --git a/lib/std/fmt/errol.zig b/lib/std/fmt/errol.zig index e697b7d42f..e98c23f6ec 100644 --- a/lib/std/fmt/errol.zig +++ b/lib/std/fmt/errol.zig @@ -92,7 +92,10 @@ pub fn errol3(value: f64, buffer: []u8) FloatDecimal { }; } - return errol3u(value, buffer); + // We generate digits starting at index 1. If rounding a buffer later then it may be + // required to generate a preceding digit in some cases (9.999) in which case we use + // the 0-index for this extra digit. + return errol3u(value, buffer[1..]); } /// Uncorrected Errol3 double to ASCII conversion. @@ -162,11 +165,7 @@ fn errol3u(val: f64, buffer: []u8) FloatDecimal { } // digit generation - - // We generate digits starting at index 1. If rounding a buffer later then it may be - // required to generate a preceding digit in some cases (9.999) in which case we use - // the 0-index for this extra digit. - var buf_index: usize = 1; + var buf_index: usize = 0; while (true) { var hdig = @floatToInt(u8, math.floor(high.val)); if ((high.val == @intToFloat(f64, hdig)) and (high.off < 0)) hdig -= 1; @@ -192,7 +191,7 @@ fn errol3u(val: f64, buffer: []u8) FloatDecimal { buf_index += 1; return FloatDecimal{ - .digits = buffer[1..buf_index], + .digits = buffer[0..buf_index], .exp = exp, }; }