Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in
/home/bateeqjg/public_html/news/wp-content/plugins/wp-syntax/wp-syntax.php on line
380
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in
/home/bateeqjg/public_html/news/wp-content/plugins/wp-syntax/wp-syntax.php on line
380
Warning: Undefined array key "layout" in
/home/bateeqjg/public_html/news/wp-content/plugins/wp-about-author/wp-about-author.php on line
94

Today’s Code of the Day is about decimal expansion, which is just division.
So you might be asking yourself, “if decimal expansion is divsion. Then why not use a/b?”.
Well the problem is that Javascript has a ton of problems when dealing with floating point operations because of the way they are stored.
Examples:
var a = 1/3;
a.toString() // returns "0.3333333333333333"
a.toFixed(25); // returns "0.3333333333333333148296163"
0.1 + 0.2; // returns 0.30000000000000004 |
var a = 1/3;
a.toString() // returns "0.3333333333333333"
a.toFixed(25); // returns "0.3333333333333333148296163"
0.1 + 0.2; // returns 0.30000000000000004
Source for decimalExpansion()
// borrowed from jQuery 1.7.2
var isNumeric = function(val){
return !isNaN(parseFloat(val)) && isFinite(val);
};
/**
* @author Larry Battle <http://bateru.com/news/contact-me>
* @date May 16, 2012
* @license MIT and GPLv3
*/
//decimalExpansion returns a string representation of a divided by b to a fixed length.
// All the paramaters must be whole numbers.
// Example: decimalExpansion( 1, 3, 3 ) === "0.333"
var decimalExpansion = function (top, bottom, decLength) {
if (!isNumeric(top) || !isNumeric(bottom) || !isNumeric(decLength) || !bottom) {
return null;
}
var sign = ((top * bottom) != Math.abs(top * bottom)) ? "-" : "";
top = Math.abs(top);
bottom = Math.abs(bottom);
decLength = Math.abs(decLength);
var result = Math.floor(top / bottom),
remainder = top % bottom,
maxDecimal = 100,
i = Math.min(Math.max(0, decLength), maxDecimal) + 1;
if (1 < i) {
result += ".";
while (i--) {
top = remainder * 10;
remainder = top % bottom;
result += "" + Math.floor(top / bottom);
}
result = result.replace(/(\d)(\d)$/, function (match, a, b) {
return +b > 4 ? +a + 1 : a;
});
}
return sign + result;
}; |
// borrowed from jQuery 1.7.2
var isNumeric = function(val){
return !isNaN(parseFloat(val)) && isFinite(val);
};
/**
* @author Larry Battle <http://bateru.com/news/contact-me>
* @date May 16, 2012
* @license MIT and GPLv3
*/
//decimalExpansion returns a string representation of a divided by b to a fixed length.
// All the paramaters must be whole numbers.
// Example: decimalExpansion( 1, 3, 3 ) === "0.333"
var decimalExpansion = function (top, bottom, decLength) {
if (!isNumeric(top) || !isNumeric(bottom) || !isNumeric(decLength) || !bottom) {
return null;
}
var sign = ((top * bottom) != Math.abs(top * bottom)) ? "-" : "";
top = Math.abs(top);
bottom = Math.abs(bottom);
decLength = Math.abs(decLength);
var result = Math.floor(top / bottom),
remainder = top % bottom,
maxDecimal = 100,
i = Math.min(Math.max(0, decLength), maxDecimal) + 1;
if (1 < i) {
result += ".";
while (i--) {
top = remainder * 10;
remainder = top % bottom;
result += "" + Math.floor(top / bottom);
}
result = result.replace(/(\d)(\d)$/, function (match, a, b) {
return +b > 4 ? +a + 1 : a;
});
}
return sign + result;
};
Test cases:
Demo:
Here are excellent links over the topic.
Wolfram MathWorld: Decimal Expansion
Wikipedia.org: Fraction (mathematics)
Oracle: What Every Computer Scientist Should Know About Floating-Point Arithmetic