summaryrefslogtreecommitdiffstats
path: root/src/decimal-round.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/decimal-round.h')
-rw-r--r--src/decimal-round.h44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/decimal-round.h b/src/decimal-round.h
new file mode 100644
index 000000000..6b412685e
--- /dev/null
+++ b/src/decimal-round.h
@@ -0,0 +1,44 @@
+#ifndef SEEN_DECIMAL_ROUND_H
+#define SEEN_DECIMAL_ROUND_H
+
+#include <cmath>
+
+#include "round.h"
+
+
+namespace Inkscape {
+
+/** Returns x rounded to the nearest \a nplaces decimal places.
+
+ Implemented in terms of Inkscape::round, i.e. we make no guarantees as to what happens if x is
+ half way between two rounded numbers. Add a note to the documentation if you care which
+ candidate is chosen for such case (round towards -infinity, +infinity, 0, or "even").
+
+ Note: nplaces is the number of decimal places without using scientific (e) notation, not the
+ number of significant figures. This function may not be suitable for values of x whose
+ magnitude is so far from 1 that one would want to use scientific (e) notation.
+
+ The current implementation happens to allow nplaces to be negative: e.g. nplaces=-2 means
+ rounding to a multiple of 100. May or may not be useful.
+**/
+inline double
+decimal_round(double const x, int const nplaces)
+{
+ double const multiplier = std::pow(10.0, nplaces);
+ return Inkscape::round( x * multiplier ) / multiplier;
+}
+
+}
+
+#endif /* !SEEN_DECIMAL_ROUND_H */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :