Opened 12 years ago

Closed 11 years ago

# dojo.number.round(162.295, 2) returns 162.29

Reported by: Owned by: kschneid Adam Peller high tbd General 1.1.0

### Description

I'm doing some currency calculations and getting bitten by JavaScript's handling of floating point numbers. I was hoping that dojo.number.round would address the issues of typical solutions, like:

Math.round(162.295 * 100) / 100

In this case, (162.295 * 100) = 16229.499999999998, which causes the call to Math.round to return 16229 (it should return 16230). Although dojo.number.round is a more general-purpose solution, it still relies on:

Math.round(value * factor)/factor

which I believe is causing the problem.

### comment:1 Changed 12 years ago by Adam Peller

Owner: changed from anonymous to Adam Peller new → assigned

### comment:2 Changed 12 years ago by Adam Peller

Milestone: tbd → 1.3 → fixed assigned → closed

Fixed in [15634)

### comment:3 Changed 12 years ago by Adam Peller

Fixed in [15634] and [15941]

### comment:4 Changed 12 years ago by Adam Peller

the new implementation adds a small delta which tries to compensate for floating point artifacts, at least if they were not arithmetically augmented prior to the call. Within the method, we now use Number.toFixed() which does not require the extra arithmetic to shift decimal places and should be *much* faster. There is still a multiply/divide by factor, which is usually 1 or 2, depending on the parameters, and therefore would not cause any additional damage unless irregular values were provided for 'increment'. Hope this helps.

### comment:5 Changed 11 years ago by Adam Peller

(In [16814]) Support 14 sig figs. Fixes #8699, Refs #7930 !strict

### comment:6 Changed 11 years ago by Adam Peller

see [16820]. Moved this rounding trick out of dojo.number.round to dojox.math.round as an experimental routine, both for backwards compat and because of the range limitation for accuracy, and added documentation to warn of the possibility of floating point rounding error.

### comment:7 Changed 11 years ago by Adam Peller

Milestone: 1.3 → tbd fixed closed → reopened

Hmm... this may be a FF bug after all, at least now that we're using toFixed in dojo.number.round

### comment:8 Changed 11 years ago by bill

[17053] comments out the tests until this bug is fixed.

### comment:9 Changed 11 years ago by Adam Peller

Resolution: → wontfix reopened → closed

I think the best we can do for now is offer the fudge factor solution at dojox.math.round, but leave dojo.number alone to avoid issues with compatibility and accuracy, and recognize that this is an inherent problem in the Javascript language we cannot fix.

Note: See TracTickets for help on using tickets.