diff --git a/django/forms/fields.py b/django/forms/fields.py
index dd23b12..6f8d1a3 100644
--- a/django/forms/fields.py
+++ b/django/forms/fields.py
@@ -301,23 +301,33 @@ class DecimalField(Field):
         if value != value or value == Decimal("Inf") or value == Decimal("-Inf"):
             raise ValidationError(self.error_messages['invalid'])
         sign, digittuple, exponent = value.as_tuple()
-        decimals = abs(exponent)
-        # digittuple doesn't include any leading zeros.
-        digits = len(digittuple)
-        if decimals > digits:
-            # We have leading zeros up to or past the decimal point.  Count
-            # everything past the decimal point as a digit.  We do not count
-            # 0 before the decimal point as a digit since that would mean
-            # we would not allow max_digits = decimal_places.
-            digits = decimals
-        whole_digits = digits - decimals
-
-        if self.max_digits is not None and digits > self.max_digits:
-            raise ValidationError(self.error_messages['max_digits'] % self.max_digits)
-        if self.decimal_places is not None and decimals > self.decimal_places:
-            raise ValidationError(self.error_messages['max_decimal_places'] % self.decimal_places)
-        if self.max_digits is not None and self.decimal_places is not None and whole_digits > (self.max_digits - self.decimal_places):
-            raise ValidationError(self.error_messages['max_whole_digits'] % (self.max_digits - self.decimal_places))
+        if exponent < 0:
+            decimals = abs(exponent)
+            # digittuple doesn't include any leading zeros.
+            digits = len(digittuple)
+            if decimals > digits:
+                # We have leading zeros up to or past the decimal point.  Count
+                # everything past the decimal point as a digit.  We do not count
+                # 0 before the decimal point as a digit since that would mean
+                # we would not allow max_digits = decimal_places.
+                digits = decimals
+            whole_digits = digits - decimals
+
+            if self.max_digits is not None and digits > self.max_digits:
+                raise ValidationError(self.error_messages['max_digits'] % self.max_digits)
+            if (self.decimal_places is not None) and (decimals > self.decimal_places):
+                raise ValidationError(self.error_messages['max_decimal_places']
+                                                          % self.decimal_places)
+            if (self.max_digits is not None)     and (
+                self.decimal_places is not None) and (
+                whole_digits > (self.max_digits - self.decimal_places)):
+                raise ValidationError(self.error_messages['max_whole_digits']
+                                     % (self.max_digits - self.decimal_places))
+        else:
+            digits = len(digittuple) + exponent
+            if self.max_digits is not None and digits > self.max_digits:
+                raise ValidationError(self.error_messages['max_digits'] % self.max_digits)
+
         return value
 
 class BaseTemporalField(Field):
diff --git a/tests/regressiontests/forms/tests/__init__.py b/tests/regressiontests/forms/tests/__init__.py
index 39db39f..5543fac 100644
--- a/tests/regressiontests/forms/tests/__init__.py
+++ b/tests/regressiontests/forms/tests/__init__.py
@@ -8,7 +8,7 @@ from media import *
 from models import *
 from regressions import *
 from util import *
-from validators import TestFieldWithValidators
+from validators import *
 from widgets import *
 
 from regressiontests.forms.localflavortests import (
diff --git a/tests/regressiontests/forms/tests/validators.py b/tests/regressiontests/forms/tests/validators.py
index cadf660..bbabba4 100644
--- a/tests/regressiontests/forms/tests/validators.py
+++ b/tests/regressiontests/forms/tests/validators.py
@@ -3,6 +3,7 @@ from django.core import validators
 from django.core.exceptions import ValidationError
 from django.utils.unittest import TestCase
 
+from decimal import Decimal
 
 class TestFieldWithValidators(TestCase):
     def test_all_errors_get_reported(self):
@@ -14,3 +15,16 @@ class TestFieldWithValidators(TestCase):
             field.clean('not int nor mail')
         except ValidationError, e:
             self.assertEqual(2, len(e.messages))
+
+
+class DecimalFieldTests(TestCase):
+    def test_validate(self):
+        f = forms.DecimalField(max_digits=10, decimal_places=1)
+        try:
+            # regression test for #15775: scientific notation with positive exponent is valid
+            f.validate(Decimal('1E+2'))
+            f.validate(Decimal('1E-1'))
+            f.validate(Decimal('100'))
+        except ValidationError:
+            self.fail("Validation is not working properly")
+        self.assertRaises(ValidationError, f.validate, Decimal('1E-2'))
