Avoid excessive rounding for unweighted inclusive Gregory in non-integer modes
This commit is contained in:
parent
f8ee464421
commit
77d773605a
@ -39,7 +39,7 @@
|
|||||||
<select id="selPreset" onchange="changePreset()">
|
<select id="selPreset" onchange="changePreset()">
|
||||||
<option value="scottish" selected>Scottish STV</option>
|
<option value="scottish" selected>Scottish STV</option>
|
||||||
<option value="stvc">pyRCV STV-C</option>
|
<option value="stvc">pyRCV STV-C</option>
|
||||||
<option value="senate">Australian Senate STV</option>
|
<!--<option value="senate">Australian Senate STV</option>-->
|
||||||
<option value="wright">Wright STV</option>
|
<option value="wright">Wright STV</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
|
@ -458,9 +458,9 @@ class BaseUIGSTVCounter(BaseSTVCounter):
|
|||||||
# Credit votes
|
# Credit votes
|
||||||
for candidate, cand_votes in next_preferences.items():
|
for candidate, cand_votes in next_preferences.items():
|
||||||
__pragma__('opov')
|
__pragma__('opov')
|
||||||
self.candidates[candidate].transfers += Num(cand_votes.__floor__().pp(0))
|
self.candidates[candidate].transfers += cand_votes.to_num()
|
||||||
__pragma__('noopov')
|
__pragma__('noopov')
|
||||||
|
|
||||||
__pragma__('opov')
|
__pragma__('opov')
|
||||||
self.exhausted.transfers += Num(next_exhausted.__floor__().pp(0))
|
self.exhausted.transfers += next_exhausted.to_num()
|
||||||
__pragma__('noopov')
|
__pragma__('noopov')
|
||||||
|
@ -23,9 +23,21 @@ class Rational:
|
|||||||
self.impl = bigRat(val)
|
self.impl = bigRat(val)
|
||||||
|
|
||||||
def pp(self, dp):
|
def pp(self, dp):
|
||||||
"""Pretty print to specified number of decimal places"""
|
"""
|
||||||
|
Pretty print to specified number of decimal places
|
||||||
|
This will fail for numbers which cannot be represented as a JavaScript number
|
||||||
|
"""
|
||||||
return self.impl.valueOf().toFixed(dp)
|
return self.impl.valueOf().toFixed(dp)
|
||||||
|
|
||||||
|
def to_num(self):
|
||||||
|
"""
|
||||||
|
Convert to an instance of Num
|
||||||
|
"""
|
||||||
|
from pyRCV2.numbers import Num
|
||||||
|
__pragma__('opov')
|
||||||
|
return Num(self.impl.numerator.toString()) / Num(self.impl.denominator.toString())
|
||||||
|
__pragma__('noopov')
|
||||||
|
|
||||||
def __add__(self, other):
|
def __add__(self, other):
|
||||||
return Rational(self.impl.add(other.impl))
|
return Rational(self.impl.add(other.impl))
|
||||||
def __sub__(self, other):
|
def __sub__(self, other):
|
||||||
|
@ -26,9 +26,18 @@ class Rational:
|
|||||||
self.impl = Fraction(val)
|
self.impl = Fraction(val)
|
||||||
|
|
||||||
def pp(self, dp):
|
def pp(self, dp):
|
||||||
"""Pretty print to specified number of decimal places"""
|
"""
|
||||||
|
Pretty print to specified number of decimal places
|
||||||
|
"""
|
||||||
return format(self.impl, '.{}f'.format(dp))
|
return format(self.impl, '.{}f'.format(dp))
|
||||||
|
|
||||||
|
def to_num(self):
|
||||||
|
"""
|
||||||
|
Convert to an instance of Num
|
||||||
|
"""
|
||||||
|
from pyRCV2.numbers import Num
|
||||||
|
return Num(self.impl.numerator) / Num(self.impl.denominator)
|
||||||
|
|
||||||
def __add__(self, other):
|
def __add__(self, other):
|
||||||
return Rational(self.impl + other.impl)
|
return Rational(self.impl + other.impl)
|
||||||
def __sub__(self, other):
|
def __sub__(self, other):
|
||||||
|
Reference in New Issue
Block a user