diff --git a/mysql-test/t/insert.test b/mysql-test/t/insert.test
index 68bb7a51623dc8db09343df6b118879ab07bb4bd..0b5a12fa52340e373846ce00dea63c864cfe5362 100644
--- a/mysql-test/t/insert.test
+++ b/mysql-test/t/insert.test
@@ -423,6 +423,9 @@ INSERT INTO t1(a,c) VALUES (-1.87e-2, -1.87e-2);
 INSERT INTO t1(a,c) VALUES (5000e+0, 5000e+0);
 INSERT INTO t1(a,c) VALUES (-5000e+0, -5000e+0);
 
+# Expected results are "12.2" and "1.2e+78", but Windows returns "12.3" and
+# "1.3e+78" due to different rounding rules
+--replace_result 12.3 12.2 1.3e+78 1.2e+78
 SELECT * FROM t1;
 
 DROP TABLE t1;
diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test
index 258799228a50f1ec4d64d5abb66679b020df9af0..ccd487a72ea3734baf8a74adb344f02e2fe54972 100644
--- a/mysql-test/t/variables.test
+++ b/mysql-test/t/variables.test
@@ -51,6 +51,8 @@ select @test, @`test`, @TEST, @`TEST`, @"teSt";
 set @select=2,@t5=1.23456;
 select @`select`,@not_used;
 set @test_int=10,@test_double=1e-10,@test_string="abcdeghi",@test_string2="abcdefghij",@select=NULL;
+# Expected result "1e-10", windows returns "1e-010"
+--replace_result 1e-010 1e-10
 select @test_int,@test_double,@test_string,@test_string2,@select;
 set @test_int="hello",@test_double="hello",@test_string="hello",@test_string2="hello";
 select @test_int,@test_double,@test_string,@test_string2;
diff --git a/sql/field.cc b/sql/field.cc
index a9aca5dc6e0492d1f82e175c32aa18257d098bf2..31d2af1bb14a71740e4545dd888bbdced633c83e 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -5953,8 +5953,11 @@ int Field_str::store(double nr)
   */
   if (exp >= (int) digits || exp < -4)
     digits= max(0, (int) (max_length - 5 - (exp >= 100 || exp <= -100)));
+
+  /* Limit precision to DBL_DIG to avoid garbage past significant digits */
+  set_if_smaller(digits, DBL_DIG);
   
-  length= (uint) my_sprintf(buff, (buff, "%-.*g", min(digits, DBL_DIG ), nr));
+  length= (uint) my_sprintf(buff, (buff, "%-.*g", digits, nr));
 
 #ifdef __WIN__
   /*