diff --git a/currency/currency.module b/currency/currency.module
index c19a189..9ffc12b 100644
--- a/currency/currency.module
+++ b/currency/currency.module
@@ -98,7 +98,7 @@ function currency_menu() {
  * Implements hook_element_info().
  */
 function currency_element_info() {
-  // An element to collect an amount of money and convert it to a float.
+  // An element to collect an amount of money and convert it to a numeric string.
   $elements['currency_amount'] = array(
     '#input' => TRUE,
     '#process' => array('currency_form_currency_amount_process'),
@@ -107,9 +107,9 @@ function currency_element_info() {
       'currency_code' => 'XXX',
     ),
     '#element_validate' => array('currency_form_currency_amount_validate'),
-    // The minimum amount as a float, or FALSE to omit.
+    // The minimum amount as a numeric string, or FALSE to omit.
     '#minimum_amount' => FALSE,
-    // The maximum amount as a float, or FALSE to omit.
+    // The maximum amount as a numeric string, or FALSE to omit.
     '#maximum_amount' => FALSE,
     // The ISO 4217 code of the currency the amount should be in. Use FALSE to
     // let users choose.
@@ -295,6 +295,7 @@ function currency_form_currency_amount_validate(array $element, array &$form_sta
   }
 
   // Confirm the amount lies within the allowed range.
+  // @todo Make sure comparing numeric strings works.
   $currency = currency_load($currency_code);
   if ($element['#minimum_amount'] !== FALSE && $amount < $element['#minimum_amount']) {
     form_error($element['amount'], t('The minimum amount is !amount.', array(
@@ -308,8 +309,8 @@ function currency_form_currency_amount_validate(array $element, array &$form_sta
   }
 
   // The amount in $form_state is a human-readable, optionally localized
-  // string, which cannot be used by other code. $amount is a float after
-  // running it through Input::parseAmount().
+  // string, which cannot be used by other code. $amount is a numeric string
+  // after running it through Input::parseAmount().
   form_set_value($element, array(
     'amount' => $amount,
     'currency_code' => $currency_code,
diff --git a/currency/includes/Currency.inc b/currency/includes/Currency.inc
index 2df6e81..149285e 100644
--- a/currency/includes/Currency.inc
+++ b/currency/includes/Currency.inc
@@ -63,7 +63,8 @@ class Currency extends BartFeenstra\Currency\Currency {
    * This is a wrapper for CurrencyLocalePattern::format() in situations where
    * the environment's default locale pattern should be used.
    *
-   * @param float $amount
+   * @param string $amount
+   *   A numeric string.
    *
    * @return string
    */
@@ -74,6 +75,10 @@ class Currency extends BartFeenstra\Currency\Currency {
   /**
    * Returns the rounding step.
    *
+   * @todo As the return value is used for computations, we cannot return a
+   * float. Find a way to return an integer or string in a format that does not
+   * cause precision loss.
+   *
    * @return int|float|false
    */
   function getRoundingStep() {
diff --git a/currency/includes/CurrencyAmountViewsHandlerField.inc b/currency/includes/CurrencyAmountViewsHandlerField.inc
index 0f48e2e..73f91d7 100644
--- a/currency/includes/CurrencyAmountViewsHandlerField.inc
+++ b/currency/includes/CurrencyAmountViewsHandlerField.inc
@@ -131,21 +131,19 @@ class CurrencyAmountViewsHandlerField extends views_handler_field {
   }
 
   /**
-   * Gets this field's amount as a float.
+   * Gets this field's.
    *
    * If the amount cannot be fetched from your implementation's database field
-   * as a float or a format that can easily be parsed to a float, such as a
-   * string or an integer, you should override this method so it returns a
-   * float representation of the amount.
+   * as a numeric string, you should override this method so it returns a
+   * numeric/decimal representation of the amount.
    *
    * @param mixed $amount_value
    *   The amount as Views fetched it from the database.
    *
-   * @return float
+   * @return string
+   *   A numeric string.
    */
   function getAmount($amount_value) {
-    // Even if the amount is stored as a float, in most cases it is returned as
-    // a string, so cast it.
-    return (float) $amount_value;
+    return $amount_value;
   }
 }
diff --git a/currency/includes/CurrencyExchangerFixedRates.inc b/currency/includes/CurrencyExchangerFixedRates.inc
index 4fc7c6d..cec44fe 100644
--- a/currency/includes/CurrencyExchangerFixedRates.inc
+++ b/currency/includes/CurrencyExchangerFixedRates.inc
@@ -57,7 +57,7 @@ class CurrencyExchangerFixedRates implements CurrencyExchangerInterface {
         ->fields('ccfr')
         ->execute();
       foreach ($result as $row) {
-        $rates[$row->currency_code_from][$row->currency_code_to] = (float) $row->rate;
+        $rates[$row->currency_code_from][$row->currency_code_to] = $row->rate;
       }
     }
 
@@ -79,7 +79,7 @@ class CurrencyExchangerFixedRates implements CurrencyExchangerInterface {
    *
    * @param string $currency_code_from
    * @param string $currency_code_to
-   * @param int|float $rate
+   * @param string $rate
    *
    * @return int
    *   MergeQuery::STATUS_INSERT or MergeQuery::STATUS_UPDATE.
diff --git a/currency/includes/CurrencyExchangerInterface.inc b/currency/includes/CurrencyExchangerInterface.inc
index a024428..0d543e3 100644
--- a/currency/includes/CurrencyExchangerInterface.inc
+++ b/currency/includes/CurrencyExchangerInterface.inc
@@ -16,8 +16,8 @@ interface CurrencyExchangerInterface {
    * @param string $currency_code_from
    * @param string $currency_code_to
    *
-   * @return float|false
-   *   A float if the rate could be found, FALSE if it couldn't.
+   * @return string|false
+   *   A numeric string if the rate could be found, FALSE if it couldn't.
    */
   static function load($currency_code_from, $currency_code_to);
 
@@ -34,7 +34,7 @@ interface CurrencyExchangerInterface {
    * @return array
    *   Keys are the ISO 4217 codes of source currencies, values are arrays of
    *   which the keys are ISO 4217 codes of destination currencies and values
-   *   are the exchange rates as floats, or FALSE for combinations of
+   *   are the exchange rates as numeric strings, or FALSE for combinations of
    *   currencies for which no exchange rate could be found. Example:
    *   array(
    *     'EUR' => array(
diff --git a/currency/includes/CurrencyLocalePattern.inc b/currency/includes/CurrencyLocalePattern.inc
index 9316cad..b56ac1d 100644
--- a/currency/includes/CurrencyLocalePattern.inc
+++ b/currency/includes/CurrencyLocalePattern.inc
@@ -76,7 +76,8 @@ class CurrencyLocalePattern {
    * Formats an amount using this pattern.
    *
    * @param Currency $currency
-   * @param float $amount
+   * @param string $amount
+   *   A numeric string.
    *
    * @return string
    */
diff --git a/currency/tests/CurrencyAmountFormElementWebTestCase.test b/currency/tests/CurrencyAmountFormElementWebTestCase.test
index f79c189..905be78 100644
--- a/currency/tests/CurrencyAmountFormElementWebTestCase.test
+++ b/currency/tests/CurrencyAmountFormElementWebTestCase.test
@@ -42,7 +42,7 @@ class CurrencyAmountFormElementWebTestCase extends DrupalWebTestCase {
     $this->drupalPost($path, $values, t('Submit'));
     $this->assertUrl('user', array(), 'A valid value higher than an explicitely configured <em>#minimum_value</em> triggers form submission.');
     $this->assertRaw("\$form_state['amount'] = " . var_export(array(
-      'amount' => 50.95,
+      'amount' => '50.95',
       'currency_code' => 'EUR',
     ), TRUE));
 
@@ -55,7 +55,7 @@ class CurrencyAmountFormElementWebTestCase extends DrupalWebTestCase {
     $this->drupalPost($path . '/NLG', $values, t('Submit'));
     $this->assertUrl('user', array(), 'A valid value higher than an explicitely configured <em>#minimum_value</em> triggers form submission.');
     $this->assertRaw("\$form_state['amount'] = " . var_export(array(
-      'amount' => 50.95,
+      'amount' => '50.95',
       'currency_code' => 'NLG',
     ), TRUE));
 
diff --git a/currency/tests/CurrencyConverterBartFeenstraCurrencyWebTestCase.test b/currency/tests/CurrencyConverterBartFeenstraCurrencyWebTestCase.test
index 91d572a..50caa74 100644
--- a/currency/tests/CurrencyConverterBartFeenstraCurrencyWebTestCase.test
+++ b/currency/tests/CurrencyConverterBartFeenstraCurrencyWebTestCase.test
@@ -34,10 +34,10 @@ class CurrencyExchangerBartFeenstraCurrencyWebTestCase extends DrupalWebTestCase
   function testCurrencyExchangerBartFeenstraCurrency() {
     // Test CurrencyExchangerBartFeenstraCurrency::load().
     // Test an available exchange rate.
-    $this->assertEqual(CurrencyExchangerBartFeenstraCurrency::load('EUR', 'NLG'), 2.20371);
+    $this->assertIdentical(CurrencyExchangerBartFeenstraCurrency::load('EUR', 'NLG'), '2.20371');
     // Test an unavailable exchange rate for which the reverse rate is
     // available.
-    $this->assertEqual(round(CurrencyExchangerBartFeenstraCurrency::load('NLG', 'EUR'), 5), 0.45378);
+    $this->assertIdentical(round(CurrencyExchangerBartFeenstraCurrency::load('NLG', 'EUR'), 5), '0.45378');
 
     // Test CurrencyExchangerBartFeenstraCurrency::loadMultiple().
     // Test an available exchange rate.
@@ -46,7 +46,7 @@ class CurrencyExchangerBartFeenstraCurrencyWebTestCase extends DrupalWebTestCase
     ));
     $this->assertTrue(isset($rates['EUR']));
     $this->assertTrue(isset($rates['EUR']['NLG']));
-    $this->assertEqual($rates['EUR']['NLG'], 2.20371);
+    $this->assertIdentical($rates['EUR']['NLG'], '2.20371');
     // Test an unavailable exchange rate for which the reverse rate is
     // available.
     $rates = CurrencyExchangerBartFeenstraCurrency::loadMultiple(array(
@@ -54,6 +54,6 @@ class CurrencyExchangerBartFeenstraCurrencyWebTestCase extends DrupalWebTestCase
     ));
     $this->assertTrue(isset($rates['NLG']));
     $this->assertTrue(isset($rates['NLG']['EUR']));
-    $this->assertEqual(round($rates['NLG']['EUR'], 5), 0.45378);
+    $this->assertIdentical(round($rates['NLG']['EUR'], 5), '0.45378');
   }
 }
\ No newline at end of file
diff --git a/currency/tests/CurrencyConverterFixedRatesUIWebTestCase.test b/currency/tests/CurrencyConverterFixedRatesUIWebTestCase.test
index 4614e33..759f463 100644
--- a/currency/tests/CurrencyConverterFixedRatesUIWebTestCase.test
+++ b/currency/tests/CurrencyConverterFixedRatesUIWebTestCase.test
@@ -44,23 +44,23 @@ class CurrencyExchangerFixedRatesUIWebTestCase extends DrupalWebTestCase {
     $currency_code_to = 'NLG';
 
     // Test adding a exchange rate.
-    $rate = 3;
+    $rate = '3';
     $values = array(
       'currency_code_from' => $currency_code_from,
       'currency_code_to' => $currency_code_to,
       'rate[amount]' => $rate,
     );
     $this->drupalPost($path . '/add', $values, t('Save'));
-    $this->assertEqual(CurrencyExchangerFixedRates::load($currency_code_from, $currency_code_to), $rate);
+    $this->assertIdentical(CurrencyExchangerFixedRates::load($currency_code_from, $currency_code_to), $rate);
 
     // Test editing a exchange rate.
-    $rate = 6;
+    $rate = '6';
     $values = array(
       'rate[amount]' => $rate,
     );
     $this->drupalPost($path . '/' . $currency_code_from . '/' . $currency_code_to, $values, t('Save'));
     drupal_static_reset('CurrencyExchangerFixedRates');
-    $this->assertEqual(CurrencyExchangerFixedRates::load($currency_code_from, $currency_code_to), $rate);
+    $this->assertIdentical(CurrencyExchangerFixedRates::load($currency_code_from, $currency_code_to), $rate);
 
     // Test deleting a exchange rate.
     $this->drupalPost($path . '/' . $currency_code_from . '/' . $currency_code_to, $values, t('Delete'));
diff --git a/currency/tests/CurrencyConverterFixedRatesWebTestCase.test b/currency/tests/CurrencyConverterFixedRatesWebTestCase.test
index 0afec1c..b192ca1 100644
--- a/currency/tests/CurrencyConverterFixedRatesWebTestCase.test
+++ b/currency/tests/CurrencyConverterFixedRatesWebTestCase.test
@@ -38,10 +38,10 @@ class CurrencyExchangerFixedRatesWebTestCase extends DrupalWebTestCase {
 
     // Test CurrencyExchangerFixedRates::load().
     // Test an available exchange rate.
-    $this->assertEqual(CurrencyExchangerFixedRates::load('EUR', 'NLG'), 5);
+    $this->assertIdentical(CurrencyExchangerFixedRates::load('EUR', 'NLG'), '5');
     // Test an unavailable exchange rate for which the reverse rate is
     // available.
-    $this->assertEqual(CurrencyExchangerFixedRates::load('NLG', 'EUR'), 0.2);
+    $this->assertIdentical(CurrencyExchangerFixedRates::load('NLG', 'EUR'), '0.2');
     // Test an unavailable exchange rate for no the reverse rate is
     // available.
     $this->assertFalse(CurrencyExchangerFixedRates::load('NLG', 'XXX'));
@@ -54,12 +54,12 @@ class CurrencyExchangerFixedRatesWebTestCase extends DrupalWebTestCase {
     // Test an available exchange rate.
     $this->assertTrue(isset($rates['EUR']));
     $this->assertTrue(isset($rates['EUR']['NLG']));
-    $this->assertEqual($rates['EUR']['NLG'], 5);
+    $this->assertIdentical($rates['EUR']['NLG'], '5');
     // Test an unavailable exchange rate for which the reverse rate is
     // available.
     $this->assertTrue(isset($rates['NLG']));
     $this->assertTrue(isset($rates['NLG']['EUR']));
-    $this->assertEqual($rates['NLG']['EUR'], 0.2);
+    $this->assertIdentical($rates['NLG']['EUR'], '0.2');
     // Test an unavailable exchange rate for which the no rate is
     // available.
     $this->assertTrue(isset($rates['EUR']));
@@ -73,6 +73,6 @@ class CurrencyExchangerFixedRatesWebTestCase extends DrupalWebTestCase {
     // Test the reverse of the deleted exchange rate.
     $this->assertFalse(CurrencyExchangerFixedRates::load('NLG', 'EUR'));
     // Test an available exchange rate.
-    $this->assertEqual(CurrencyExchangerFixedRates::load('EUR', 'UAH'), 7);
+    $this->assertIdentical(CurrencyExchangerFixedRates::load('EUR', 'UAH'), '7');
   }
 }
\ No newline at end of file
diff --git a/currency/tests/CurrencyConverterWebTestCase.test b/currency/tests/CurrencyConverterWebTestCase.test
index 9a3989f..fef36a0 100644
--- a/currency/tests/CurrencyConverterWebTestCase.test
+++ b/currency/tests/CurrencyConverterWebTestCase.test
@@ -71,11 +71,11 @@ class CurrencyExchangerWebTestCase extends DrupalWebTestCase {
 
     // Make sure the first exchanger has a rate on EUR>NLG, so it has
     // priority over the second exchanger's rate for these currencies.
-    CurrencyExchangerFixedRates::save('EUR', 'NLG', 7);
+    CurrencyExchangerFixedRates::save('EUR', 'NLG', '7');
 
     // Test CurrencyExchanger::load().
-    $this->assertEqual(CurrencyExchanger::load('EUR', 'NLG'), 7);
-    $this->assertEqual(CurrencyExchanger::load('EUR', 'DEM'), 1.95583);
+    $this->assertIdentical(CurrencyExchanger::load('EUR', 'NLG'), '7');
+    $this->assertIdentical(CurrencyExchanger::load('EUR', 'DEM'), '1.95583');
     $this->assertFalse(CurrencyExchanger::load('EUR', 'XXX'));
 
     // Test CurrencyExchanger::loadMultiple().
@@ -84,9 +84,9 @@ class CurrencyExchangerWebTestCase extends DrupalWebTestCase {
     ));
     $this->assertTrue(isset($rates['EUR']));
     $this->assertTrue(isset($rates['EUR']['NLG']));
-    $this->assertEqual($rates['EUR']['NLG'], 7);
+    $this->assertIdentical($rates['EUR']['NLG'], '7');
     $this->assertTrue(isset($rates['EUR']['DEM']));
-    $this->assertEqual($rates['EUR']['DEM'], 1.95583);
+    $this->assertIdentical($rates['EUR']['DEM'], '1.95583');
     $this->assertTrue(isset($rates['EUR']['XXX']));
     $this->assertFalse($rates['EUR']['XXX']);
   }
@@ -96,7 +96,7 @@ class CurrencyExchangerWebTestCase extends DrupalWebTestCase {
    */
   function assertIdenticalCurrencyExchangeRates() {
     // Test CurrencyExchanger::load().
-    $this->assertEqual(CurrencyExchanger::load('EUR', 'EUR'), 1);
+    $this->assertIdentical(CurrencyExchanger::load('EUR', 'EUR'), '1');
 
     // Test CurrencyExchanger::loadMultiple().
     $rates = CurrencyExchanger::loadMultiple(array(
@@ -104,6 +104,6 @@ class CurrencyExchangerWebTestCase extends DrupalWebTestCase {
     ));
     $this->assertTrue(isset($rates['EUR']));
     $this->assertTrue(isset($rates['EUR']['EUR']));
-    $this->assertEqual($rates['EUR']['EUR'], 1);
+    $this->assertIdentical($rates['EUR']['EUR'], '1');
   }
 }
