diff --git userpoints.install userpoints.install
index c290f48..6ce0f88 100644
--- userpoints.install
+++ userpoints.install
@@ -22,13 +22,17 @@ function userpoints_schema() {
       ),
       'points' => array(
         'description' => 'Current Points',
-        'type' => 'int',
+        'type' => 'numeric',
+		'precision' => 9,
+		'scale' => 2,
         'not null' => TRUE,
         'default' => 0,
       ),
       'max_points' => array(
         'description' => 'Out of a maximum points',
-        'type' => 'int',
+        'type' => 'numeric',
+		'precision' => 9,
+		'scale' => 2,
         'not null' => TRUE,
         'default' => 0,
       ),
@@ -74,7 +78,9 @@ function userpoints_schema() {
       ),
       'points' => array(
         'description' => 'Points',
-        'type' => 'int',
+        'type' => 'numeric',
+		'precision' => 9,
+		'scale' => 2,
         'not null' => TRUE,
         'default' => 0,
       ),
@@ -281,3 +287,16 @@ function userpoints_update_6012() {
   db_add_index($ret, 'userpoints_txn', 'status_expired_expiry', array('status', 'expired', 'expirydate'));
   return $ret;
 }
+
+/*
+ * From: http://drupal.org/node/417830
+ * Points become numeric
+ */
+
+ function userpoints_update_6013() {
+ $ret = array();
+ db_change_field($ret, 'userpoints_txn', 'points', 'points', array('type' => 'numeric', 'precision' => 9, 'scale' => 2, 'not null' => true, 'default' => 0));
+ db_change_field($ret, 'userpoints', 'points', 'points', array('type' => 'numeric', 'precision' => 9, 'scale' => 2, 'not null' => true, 'default' => 0));
+ db_change_field($ret, 'userpoints', 'max_points', 'max_points', array('type' => 'numeric', 'precision' => 9, 'scale' => 2, 'not null' => true, 'default' => 0));
+ return $ret;
+ }
diff --git userpoints.module userpoints.module
index 3f38b60..ed2984f 100644
--- userpoints.module
+++ userpoints.module
@@ -481,9 +481,9 @@ function userpoints_get_current_points($uid = NULL, $tid = NULL) {
     $tid = userpoints_get_default_tid();
   }
   elseif ($tid == 'all') {
-    return (int)db_result(db_query('SELECT SUM(points) FROM {userpoints} WHERE uid = %d', $uid));
+    return (numeric)db_result(db_query('SELECT SUM(points) FROM {userpoints} WHERE uid = %d', $uid));
   }
-  return (int)db_result(db_query('SELECT points FROM {userpoints} WHERE uid = %d AND tid = %d', $uid, $tid));
+  return (numeric)db_result(db_query('SELECT points FROM {userpoints} WHERE uid = %d AND tid = %d', $uid, $tid));
 }
 
 /**
@@ -524,10 +524,10 @@ function userpoints_get_max_points($uid = NULL, $tid = NULL) {
 }
 
 /**
- * @param $params(array) or (int)
- *    if (int) assumed to be points for current user
+ * @param $params(array) or (numeric)
+ *    if (numeric) assumed to be points for current user
  *    Accepts an array of keyed variables and parameters
- *    'points' => # of points (int) (required)
+ *    'points' => # of points (numeric) (required)
  *    'moderate' => TRUE/FALSE
  *    'uid' => $user->uid
  *    'time_stamp' => unix time of the points assignement date
@@ -776,19 +776,19 @@ function _userpoints_update_cache(&$params) {
   }
 
   // Calculate the current points based upon the tid
-  $current_points = (int)$params['points'] + userpoints_get_current_points($params['uid'], $params['tid']);
+  $current_points = (numeric)$params['points'] + userpoints_get_current_points($params['uid'], $params['tid']);
   //Grab the user's maximum points to preserve it
   $max_points = db_result(db_query('SELECT max_points FROM {userpoints} WHERE uid = %d AND tid = %d',
     $params['uid'], $params['tid']));
   if ($params['points'] > 0) {
     //points are greater than zero, update their max_points
-    $max_points = (int)$params['points'] + (int)$max_points;
+    $max_points = (numeric)$params['points'] + (numeric)$max_points;
   }
 
   // insert or update the userpoints caching table with the user's current points
   if (_userpoints_user_exists($params['uid'], $params['tid'])) {
     db_query("UPDATE {userpoints}
-              SET points = %d, max_points = %d, last_update = %d
+              SET points = %n, max_points = %n, last_update = %d
               WHERE uid = %d AND tid = %d",
               $current_points,
               $max_points,
@@ -800,7 +800,7 @@ function _userpoints_update_cache(&$params) {
   else {
     $result = db_query("INSERT INTO {userpoints}
       (uid, points, max_points, last_update, tid)
-      VALUES (%d, %d, %d, %d, %d )",
+      VALUES (%d, %n, %n, %d, %d )",
       $params['uid'],
       $current_points,
       $max_points,
@@ -1700,7 +1700,7 @@ function userpoints_list_my_userpoints() {
   $args['approved_total'] = $grand_total;
 
   //Grab the unmoderated point total
-  $args['unapproved_total'] = (int)db_result(db_query("SELECT SUM(points) FROM {userpoints_txn} WHERE uid = %d AND status = 1", $uid));
+  $args['unapproved_total'] = (numeric)db_result(db_query("SELECT SUM(points) FROM {userpoints_txn} WHERE uid = %d AND status = 1", $uid));
   $args['overall_total'] = ($args['approved_total'] + $args['unapproved_total']);
 
   $header = array(
