I am trying to deal with JavaScript values such as 23.45
, but I want to be able to do mathematical operations on these values (addition, subtraction, multiplication, division) without running into floating point issues. Yes, I might need to round the results sometimes, but I would like it to give reasonable answers.
Consider this in JavaScript:
24.56 * .3
Yields
7.36799999999
I would like it to come out with 7.368
.
Most languages have either a decimal or currency data type to deal with this. Has anyone built a class that can handle this sort of data effectively, or is there any other solution for dealing with these sorts of numbers without hav开发者_如何学JAVAing to constantly adjust for floating point errors?
Integers.
There is no need to use floating-point for currency. Use fixed-point, where the number of decimal points is 0.
You count in pennies (or possibly in tenths of pennies).
Instead of using integers (which have their own problems)
I would use the bignumber.js library
There is Math
The Math object is build into the JavaScript spec so every browser has it natively.
As for data types, JavaScript has Number
. That's it. We have no other number data type. The best think to do is to try and work with Integers.
Doing some more searching, I came across this.
https://stackoverflow.com/questions/744099/javascript-bigdecimal-library
It looks like none of them are ideal, but they do the job.
ku4jQuery-kernel contains both a money class and a math utility that contain operations and rounding, including round, roundUp and roundDown. These are nice methods because you can pass a value to round to. For example you can do $.math.round(3.4567, -2) and it will round the number 3.4567 to the nearest 10^-2. The same goes for money. $.money(100.87).divide(2).roundUp().toString() will yield "$50.44". You can go further and add the denomination of money as a second parameter, say "B" for Bitcoin, $.money(100.87, "B").divide(2).roundUp().toString(). You can find more about this library here ku4jQuery-kernel and more libraries that you may find useful here kodmunki github. These libraries are closely maintained and used in many production projects. If you decide to try them, I hope that you find them useful! Happy coding :{)}
New kid on the block: moneysafe
. It's open-source, and uses a functional approach that allows smart composition.
$(.1) + $(.2) === $(.3).cents;
https://github.com/ericelliott/moneysafe
The toFixed method can round to a given number of decimals.
There is also a Javascript sprintf implementation.
精彩评论