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?
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>';
}
}
A simpler solution is to use
{point.percentage:.1f}%
in the pointFormat string
For me the upvoted solution didn't work:
tooltip: {
formatter: function () {
return this.point.name + ': <b>' + Highcharts.numberFormat(this.percentage, 1) + '%</b>';
}
}
but this did:
this.percentage.toFixed(1)
Before you go head-desk-head-desk, while trying to format the percentage.
Here are some ways to do it:
(Math.round(this.point.percentage*100)/100) + ' %'
Highcharts.numberFormat(this.percentage, 1) + '%'
this.percentage.toFixed(1)
{point.percentage}% or {point.percentage:.1f}%
I often use #4 in tooltips and labels and when not using a custom formatter function.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With