globalizejs / globalizejs/globalize

An unexpected rounding result of a percentage formatted value (floating-point arithmetic issue)   

Open
#856 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
4.8k
Forks
585
PR merge metrics
No merged PRs in 30d

Description

To reproduce the issue, call:  
`Globalize('en').formatNumber(0.145, {style: 'percent', minimumFractionDigits: 0, maximumFractionDigits: 0})   `
Expected result: “15%”  
Actual result: “14%”  
The issue can be reproduced in Chrome, IE11, Edge, Mozilla Firefox.  
  
We investigated the issue and found that the reason for unexpected rounding is multiplication by 100 in this line: https://github.com/globalizejs/globalize/blob/b08574ae714f899e50ff6a4852d9b9b8b0bc2ba0/src/number/format.js#L66. The issue is related to floating-point arithmetics. If you evaluate Math.round(0.145 * 100) in the browser console, you will get 14, because 0.145 * 100 returns 14.499999999999998.  
We found that converting the number to string with the 'toFixed' method and then converting back to the number fixes the issue: 
` n=+((n*100).toFixed(maximumFractionDigits + 1));   `
  
A similar issue was discussed in https://github.com/globalizejs/globalize/pull/386.  
  
Note: the Inlt localization works more predictably in this case:  
`Number(a).toLocaleString(undefined, { style: 'percent', minimumFractionalDigits: 0,maximumFractionDigits: 0 }) `
return “15%”  

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.