diff --git a/addons/decimal_precision/decimal_precision.py b/addons/decimal_precision/decimal_precision.py
index eeacab9203ee9d6b1e215572019d89eb8e7b3b73..f06e88ddda1b1ad39f6df1e62f4304356c1adb7f 100644
--- a/addons/decimal_precision/decimal_precision.py
+++ b/addons/decimal_precision/decimal_precision.py
@@ -48,10 +48,11 @@ class decimal_precision(orm.Model):
     def clear_cache(self, cr):
         """clear cache and update models. Notify other workers to restart their registry."""
         self.precision_get.clear_cache(self)
-        for obj in self.pool.obj_list():
-            for colname, col in self.pool.get(obj)._columns.items():
-                if hasattr(col, 'digits_change'):
-                    col.digits_change(cr)
+        env = openerp.api.Environment(cr, SUPERUSER_ID, {})
+        for model in self.pool.values():
+            for field in model._fields.values():
+                if field.type == 'float':
+                    field._setup_digits(env)
         RegistryManager.signal_caches_change(cr.dbname)
 
     def create(self, cr, uid, data, context=None):
diff --git a/openerp/fields.py b/openerp/fields.py
index e103ee14515f5a395fbc87b2ffe97f20a79c0f13..1381a3df84439dd76cba1db84f083fa082761374 100644
--- a/openerp/fields.py
+++ b/openerp/fields.py
@@ -933,9 +933,16 @@ class Float(Field):
     def __init__(self, string=None, digits=None, **kwargs):
         super(Float, self).__init__(string=string, _digits=digits, **kwargs)
 
+    def _setup_digits(self, env):
+        """ Setup the digits for `self` and its corresponding column """
+        self.digits = self._digits(env.cr) if callable(self._digits) else self._digits
+        if self.store:
+            column = env[self.model_name]._columns[self.name]
+            column.digits_change(env.cr)
+
     def _setup_regular(self, env):
         super(Float, self)._setup_regular(env)
-        self.digits = self._digits(env.cr) if callable(self._digits) else self._digits
+        self._setup_digits(env)
 
     _related_digits = property(attrgetter('digits'))
 
diff --git a/openerp/modules/registry.py b/openerp/modules/registry.py
index c87d944bd7c6c83bb0cc20080f4ac11b6605f304..679fae0cfc22640e9655c81f9d748a21beaebd59 100644
--- a/openerp/modules/registry.py
+++ b/openerp/modules/registry.py
@@ -415,10 +415,11 @@ class RegistryManager(object):
                     # One possible reason caches have been invalidated is the
                     # use of decimal_precision.write(), in which case we need
                     # to refresh fields.float columns.
-                    for model in registry.models.values():
-                        for column in model._columns.values():
-                            if hasattr(column, 'digits_change'):
-                                column.digits_change(cr)
+                    env = openerp.api.Environment(cr, SUPERUSER_ID, {})
+                    for model in registry.values():
+                        for field in model._fields.values():
+                            if field.type == 'float':
+                                field._setup_digits(env)
                 registry.base_registry_signaling_sequence = r
                 registry.base_cache_signaling_sequence = c
             finally: