# pyRCV2: Preferential vote counting # Copyright © 2020 Lee Yingtong Li (RunasSudo) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . class Rational: """ Wrapper for BigRational.js (rational arithmetic) """ def __init__(self, val): self.impl = bigRat(val) def pp(self, dp): """Pretty print to specified number of decimal places""" return self.impl.valueOf().toFixed(dp) def __add__(self, other): return Rational(self.impl.add(other.impl)) def __sub__(self, other): return Rational(self.impl.subtract(other.impl)) def __mul__(self, other): return Rational(self.impl.multiply(other.impl)) def __div__(self, other): return Rational(self.impl.divide(other.impl)) def __gt__(self, other): return self.impl.greater(other.impl) def __ge__(self, other): return self.impl.greaterOrEquals(other.impl) def __lt__(self, other): return self.impl.lesser(other.impl) def __le__(self, other): return self.impl.lesserOrEquals(other.impl) def __floor__(self): return Rational(self.impl.floor())