Internal change

PiperOrigin-RevId: 499976437
diff --git a/fuzztest/internal/type_support.cc b/fuzztest/internal/type_support.cc
index 2ae4dd1..4376505 100644
--- a/fuzztest/internal/type_support.cc
+++ b/fuzztest/internal/type_support.cc
@@ -37,7 +37,7 @@
   // format specifier is needed to reasonably choose between decimal and
   // exponential notation.
   std::string num_string =
-      absl::StrFormat("%.*g", std::numeric_limits<T>::digits10, v);
+      absl::StrFormat("%.*g", std::numeric_limits<T>::digits10 + 2, v);
   bool needs_decimal = std::isfinite(v) &&
                        !absl::StrContains(num_string, '.') &&
                        !absl::StrContains(num_string, 'e');
diff --git a/fuzztest/internal/type_support_test.cc b/fuzztest/internal/type_support_test.cc
index eb06981..b68ee51 100644
--- a/fuzztest/internal/type_support_test.cc
+++ b/fuzztest/internal/type_support_test.cc
@@ -25,6 +25,7 @@
 #include <optional>
 #include <ostream>
 #include <set>
+#include <sstream>
 #include <string>
 #include <string_view>
 #include <tuple>
@@ -37,6 +38,7 @@
 #include "gtest/gtest.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_format.h"
+#include "absl/strings/strip.h"
 #include "absl/time/time.h"
 #include "./fuzztest/domain.h"
 #include "./fuzztest/internal/domain.h"
@@ -125,9 +127,7 @@
 class FloatingTest : public testing::Test {};
 
 using FloatingTypes = testing::Types<float, double, long double>;
-
 TYPED_TEST_SUITE(FloatingTest, FloatingTypes);
-
 TYPED_TEST(FloatingTest, Printer) {
   std::string_view suffix = std::is_same_v<float, TypeParam>    ? "f"
                             : std::is_same_v<double, TypeParam> ? ""
@@ -156,6 +156,25 @@
                   std::is_same_v<float, TypeParam>    ? "std::nanf(\"\")"
                   : std::is_same_v<double, TypeParam> ? "std::nan(\"\")"
                                                       : "std::nanl(\"\")"));
+
+  // Check round tripping.
+  for (auto v : {TypeParam{0.0013660046866830892},
+                 std::numeric_limits<TypeParam>::epsilon()}) {
+    auto printed_v = TestPrintValue(v);
+    // Using stringstream isn't ideal but neither std::strto* nor
+    // //strings/numbers.h are templated (the latter can't even handle long
+    // double).
+    std::stringstream human_v_str;
+    std::stringstream source_code_v_str;
+    human_v_str << absl::StripSuffix(printed_v[0], suffix);
+    source_code_v_str << absl::StripSuffix(printed_v[1], suffix);
+    TypeParam human_v = TypeParam{0};
+    TypeParam source_code_v = TypeParam{0};
+    EXPECT_TRUE(human_v_str >> human_v);
+    EXPECT_TRUE(source_code_v_str >> source_code_v);
+    EXPECT_EQ(v, human_v);
+    EXPECT_EQ(v, source_code_v);
+  }
 }
 
 TEST(StringTest, Printer) {