Skip to content

Commit d310678

Browse files
authored
Avoid rounding error. (#200)
* fix #199; avoid rounding error * remove noop ceil
1 parent 22fa161 commit d310678

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

src/ticks.js

+10-8
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,18 @@ export default function(start, stop, count) {
1515
if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
1616

1717
if (step > 0) {
18-
start = Math.ceil(start / step);
19-
stop = Math.floor(stop / step);
20-
ticks = new Array(n = Math.ceil(stop - start + 1));
21-
while (++i < n) ticks[i] = (start + i) * step;
18+
let r0 = Math.round(start / step), r1 = Math.round(stop / step);
19+
if (r0 * step < start) ++r0;
20+
if (r1 * step > stop) --r1;
21+
ticks = new Array(n = r1 - r0 + 1);
22+
while (++i < n) ticks[i] = (r0 + i) * step;
2223
} else {
2324
step = -step;
24-
start = Math.ceil(start * step);
25-
stop = Math.floor(stop * step);
26-
ticks = new Array(n = Math.ceil(stop - start + 1));
27-
while (++i < n) ticks[i] = (start + i) / step;
25+
let r0 = Math.round(start * step), r1 = Math.round(stop * step);
26+
if (r0 / step < start) ++r0;
27+
if (r1 / step > stop) --r1;
28+
ticks = new Array(n = r1 - r0 + 1);
29+
while (++i < n) ticks[i] = (r0 + i) / step;
2830
}
2931

3032
if (reverse) ticks.reverse();

test/ticks-test.js

+4
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,7 @@ tape("ticks(start, stop, count) returns the reverse of ticks(stop, start, count)
105105
test.deepEqual(array.ticks(10, -10, 2), array.ticks(-10, 10, 2).reverse());
106106
test.deepEqual(array.ticks(10, -10, 1), array.ticks(-10, 10, 1).reverse());
107107
});
108+
109+
tape("ticks(start, stop, count) handles precision problems", (test) => {
110+
test.deepEqual(array.ticks(0.98, 1.14, 10), [0.98, 1, 1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14]);
111+
});

0 commit comments

Comments
 (0)