Highcharts Pie Chart ignores percentageDecimals tooltip setting and has floating point inaccuracy issue

Billy Reverb picture Billy Reverb · Apr 9, 2013 · Viewed 10.4k times · Source

Highcharts 3.0 seems to have floating point number accuracy issue when displaying tooltips on a pie chart. I was able to recreate the exact error by using one of the highcharts demo pie chart - Pie with Legend. Click on "Edit in JsFiddle" to edit the javascript.

Inside the javascript panel, look for the series and data section. Keep the Firefox and IE data and discard the rest of data, so we can focus on just 2 slices of pie. The two data chucks don't have percentage adding up to 100, so highcharts will recalculate percentages for us. Click the Run button on top, mouse over the slices, the percentages are very accurate with maximum number of decimals. But wait, look at the javascript tooltip option, highcharts is clearly ignoring the "percentageDecimals: 1" setting. This is issue #1.

Now let's manually edit the data percentages as follows: [ 'Firefox', 57.7 ], [ 'IE', 42.3] So they do add up to exactly 100.0. Hit Run button again, the slices tooltips display 'Firefox: 57.0000000000001%' and 'IE: 42.3%'. It looks like a percentage recalculation was done regardless if the percentages add up to 100 or not, thus introducing a small floating point inaccuracy here. This is issue #2. Had the "percentageDecimals" rounding worked in this case, this issue could have been disguised.

I would like to know: * Anyone else seeing the same issue and having some sort of work-around? * Can highcharts respond to these issues and let us know if they're known bugs?

Answer

Bruno De Freitas Barros picture Bruno De Freitas Barros · May 10, 2013

Answering this question based on Billy Reverb's comment:

Just replace this attributes:

tooltip: {
    pointFormat: '{series.name}: <b>{point.percentage}%</b>',
    percentageDecimals: 1
}

for this:

tooltip: {
    formatter: function () {
                   return this.point.name + ': <b>' + Highcharts.numberFormat(this.percentage, 1) + '%</b>';
               }
}