Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rounding issues? #490

Open
snyderjamie opened this issue Aug 13, 2019 · 0 comments
Open

Rounding issues? #490

snyderjamie opened this issue Aug 13, 2019 · 0 comments

Comments

@snyderjamie
Copy link

snyderjamie commented Aug 13, 2019

I have been trying to debug two parts of my code, with no success. I am not passing the Test Convert Target To Target with an AssertionError: AssertionError: assert 14.6615 == 14.6614 E + where 14.6615 = Currency(15.0, 'MXN').value. I think this is just a rounding error, but wanted to check.

Then secondly, I am not passing the test Test Add Methods with an AssertionError: assert 3.1496 == 4. This is more then a rounding error, but I am not seeing what is going wrong it my code.

Assignment: http://learn.rmotr.com/python/base-python-track/advanced-oop/currency-my-way-out

User code:

class Currency(object):
    USD_CONVERSIONS = {
        'CHF': 0.95,
        'CAD': 1.28,
        'GBP': 0.72,
        'JPY': 106.80,
        'EUR': 0.81,
        'USD': 1.0,
        'MXN': 18.62,
        'ARG': 20.24,
        'AUD': 1.27
    }

    def __init__(self, value, unit="USD"):
        if unit not in self.USD_CONVERSIONS:
            raise ValueError()
        self.value = value
        self.unit = unit

    def convert(self, target_unit):
        if target_unit not in self.USD_CONVERSIONS:
            raise ValueError()
        if self.unit == target_unit:
            return Currency(self.value, self.unit)
        result = (self.value / self.USD_CONVERSIONS[self.unit]
                * self.USD_CONVERSIONS[target_unit])
        self.value = round(result, 4)
        self.unit = target_unit
        return Currency(self.value, self.unit)
        

    def __str__(self):
        if self.value >= 10:
            return "{}${}".format(self.unit, round(self.value, 0))
        return "{}${}".format(self.unit, round(self.value, 1))

    def __repr__(self):
        if self.value >= 10:
            return "Currency({}, '{}')".format(round(self.value, 0), self.unit)
        return "Currency({}, '{}')".format(round(self.value, 1), self.unit)

    def __eq__(self, other):
        return self.convert(other.unit).value == other.value

    def __ne__(self, other):
        return self.convert(other.unit).value != other.value

    def __lt__(self, other):
        return self.convert(other.unit).value < other.value

    def __le__(self, other):
        return self.convert(other.unit).value <= other.value

    def __gt__(self, other):
        return self.convert(other.unit).value > other.value

    def __ge__(self, other):
        return self.convert(other.unit).value >= other.value

    def __add__(self, other):
        total = self.convert('USD').value + other.convert('USD').value
        return Currency(total, 'USD')

    def __iadd__(self, other):
        total = self.value + other.convert(self.unit).value
        self.value = total
        return Currency(self.value, self.unit)

    def __radd__(self, other):
        total = self.convert('USD').value + Currency(other).convert('USD').value
        return Currency(total, 'USD')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants