truncation instead of rounding

This commit is contained in:
Jin S 2024-02-06 15:15:39 -05:00
parent 4d38a66f96
commit f8b9e79504
2 changed files with 8 additions and 38 deletions

View File

@ -1151,47 +1151,19 @@ void write_fractional_seconds(OutputIt& out, Duration d, int precision = -1) {
out = std::fill_n(out, leading_zeroes, '0');
out = format_decimal<Char>(out, n, num_digits).end;
}
} else {
} else if (precision > 0) {
*out++ = '.';
leading_zeroes = (std::min)(leading_zeroes, precision);
int remaining = precision - leading_zeroes;
out = std::fill_n(out, leading_zeroes, '0');
if (remaining < num_digits) {
int num_truncated_digits = num_digits - remaining;
n /= to_unsigned(detail::pow10(to_unsigned(num_truncated_digits) - 1));
const int old_num_digits = detail::count_digits(n);
auto roundingDigit = n % 10;
n /= 10;
n /= to_unsigned(detail::pow10(to_unsigned(num_truncated_digits)));
if (n) {
if (roundingDigit > 5 || (roundingDigit == 5 && n % 10 % 2 != 0)) {
n += 1;
}
if (old_num_digits == detail::count_digits(n)) {
if (leading_zeroes) {
out = std::fill_n(out, leading_zeroes - 1, '0');
*out++ = '1';
out = std::fill_n(out, remaining, '0');
} else {
n -= 1;
out = format_decimal<Char>(out, n, remaining).end;
}
} else {
out = std::fill_n(out, leading_zeroes, '0');
out = format_decimal<Char>(out, n, remaining).end;
}
} else {
if (roundingDigit >= 5) {
if (leading_zeroes) {
out = std::fill_n(out, leading_zeroes - 1, '0');
*out++ = '1';
out = std::fill_n(out, remaining, '0');
}
} else {
out = std::fill_n(out, leading_zeroes, '0');
}
out = format_decimal<Char>(out, n, remaining).end;
}
return;
}
out = std::fill_n(out, leading_zeroes, '0');
if (n) {
out = format_decimal<Char>(out, n, num_digits).end;
remaining -= num_digits;

View File

@ -794,13 +794,11 @@ TEST(chrono_test, cpp20_duration_subsecond_support) {
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{12345}),
"12.34");
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{12375}),
"12.38");
"12.37");
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{-12375}),
"-12.38");
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{12054}),
"12.05");
EXPECT_EQ(fmt::format("{:.1%S}", std::chrono::milliseconds{12054}),
"12.1");
"-12.37");
EXPECT_EQ(fmt::format("{:.0%S}", std::chrono::milliseconds{12054}),
"12");
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{99999}),
"39.99");
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{1000}),