From b771a11836873f925d089047a94b385a51b422d3 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 11 Apr 2012 00:27:49 -0700 Subject: [PATCH] A 1/3 lsb offset is needed to make the multiplication round down correctly. --- src/Amount.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Amount.cpp b/src/Amount.cpp index 27ad847deb..f5ac2b125f 100644 --- a/src/Amount.cpp +++ b/src/Amount.cpp @@ -23,13 +23,13 @@ void STAmount::canonicalize() { if(offset<=cMinOffset) throw std::runtime_error("value overflow"); value*=10; - offset-=1; + --offset; } while(value>cMaxValue) { if(offset>=cMaxOffset) throw std::runtime_error("value underflow"); value/=10; - offset+=1; + ++offset; } assert( (value==0) || ( (value>=cMinValue) && (value<=cMaxValue) ) ); assert( (offset>=cMinOffset) && (offset<=cMaxOffset) ); @@ -235,11 +235,11 @@ STAmount operator*(const STAmount &v1, const STAmount &v2) { if( (v1.value == 0) || (v2.value == 0) ) return STAmount(); - // Compute (numerator * denominator) / 10^16 + // Compute (numerator*10 * denominator*10) / 10^18 CBigNum v; - if( (BN_add_word(&v, v1.value + 1) != 1) || - (BN_mul_word(&v, v2.value + 1) != 1) || - (BN_div_word(&v, 10000000000000000ull) == ((BN_ULONG)-1)) ) + if( (BN_add_word(&v, (v1.value*10) + 3) != 1) || + (BN_mul_word(&v, (v2.value*10) + 3) != 1) || + (BN_div_word(&v, 1000000000000000000ull) == ((BN_ULONG)-1)) ) { throw std::runtime_error("internal bn error"); }