Skip to content

Commit 8d9314d

Browse files
committed
#67: edge case correction
1 parent f61fd94 commit 8d9314d

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

include/decimal.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,30 @@ class dec_utils {
281281
public:
282282
// result = (value1 * value2) / divisor
283283
inline static int64 multDiv(const int64 value1, const int64 value2,
284-
int64 divisor) {
284+
int64 divisor) {
285+
286+
if (value1 == 0 || value2 == 0) {
287+
return 0;
288+
}
289+
290+
if (divisor == 1) {
291+
return value1 * value2;
292+
}
293+
294+
if (value1 == 1) {
295+
int64 result;
296+
if (RoundPolicy::div_rounded(result, value2, divisor)) {
297+
return result;
298+
}
299+
}
300+
301+
if (value2 == 1) {
302+
int64 result;
303+
if (RoundPolicy::div_rounded(result, value1, divisor)) {
304+
return result;
305+
}
306+
}
307+
285308
// we don't check for division by zero, the caller should - the next line will throw.
286309
const int64 value1int = value1 / divisor;
287310
int64 value1dec = value1 % divisor;

tests/decimalTest.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,24 @@ BOOST_AUTO_TEST_CASE(decimalAsInteger)
3636
BOOST_CHECK_EQUAL(c.getAsInteger(), expectedValue);
3737
}
3838

39+
BOOST_AUTO_TEST_CASE(issue67)
40+
{
41+
using namespace std;
42+
dec::decimal<4, dec::half_even_round_policy> p1("350.68");
43+
dec::decimal<4, dec::half_even_round_policy> p2("359.2050");
44+
45+
dec::decimal<0, dec::half_even_round_policy> s1("550");
46+
dec::decimal<0, dec::half_even_round_policy> s2("550");
47+
48+
dec::decimal<0, dec::half_even_round_policy> s_sum = s1 + s2;
49+
dec::decimal<4, dec::half_even_round_policy> p_sum = p1 + p2;
50+
dec::decimal<4, dec::half_even_round_policy> result = (p_sum / s_sum);
51+
52+
dec::decimal<4, dec::half_even_round_policy> expected("0.6454");
53+
54+
BOOST_CHECK_EQUAL(expected, result);
55+
}
56+
3957
// test with values internally > 2^32
4058
BOOST_AUTO_TEST_CASE(decimalMidOverflow)
4159
{

0 commit comments

Comments
 (0)