在Javascript中处理浮点精度[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Javascript中处理浮点精度[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我在javascript中有大量的数值y
。我想通过将它们四舍五入到最接近的x
倍数并将结果转换为字符串来对它们进行分组。
如何绕过恼人的浮点精度?
例如:
0.2 + 0.4 = 0.6000000000000001
我尝试了两件事:
>>> y = 1.23456789
>>> x = 0.2
>>> parseInt(Math.round(Math.floor(y/x))) * x;
1.2000000000000002
和:
>>> y = 1.23456789
>>> x = 0.2
>>> y - (y % x)
1.2000000000000002
答案
从这篇文章:How to deal with floating point number precision in JavaScript?
你有几个选择:
- 使用特殊的小数数据类型,如decimal.js
- 将结果格式化为固定数量的有效数字,如:
(Math.floor(y/x) * x).toFixed(2)
- 将所有数字转换为整数
另一答案
> var x = 0.1
> var y = 0.2
> var cf = 10
> x * y
0.020000000000000004
> (x * cf) * (y * cf) / (cf * cf)
0.02
快速解决方案
var _cf = (function() {
function _shift(x) {
var parts = x.toString().split('.');
return (parts.length < 2) ? 1 : Math.pow(10, parts[1].length);
}
return function() {
return Array.prototype.reduce.call(arguments, function (prev, next) { return prev === undefined || next === undefined ? undefined : Math.max(prev, _shift (next)); }, -Infinity);
};
})();
Math.a = function () {
var f = _cf.apply(null, arguments); if(f === undefined) return undefined;
function cb(x, y, i, o) { return x + f * y; }
return Array.prototype.reduce.call(arguments, cb, 0) / f;
};
Math.s = function (l,r) { var f = _cf(l,r); return (l * f - r * f) / f; };
Math.m = function () {
var f = _cf.apply(null, arguments);
function cb(x, y, i, o) { return (x*f) * (y*f) / (f * f); }
return Array.prototype.reduce.call(arguments, cb, 1);
};
Math.d = function (l,r) { var f = _cf(l,r); return (l * f) / (r * f); };
> Math.m(0.1, 0.2)
0.02
你可以查看here的完整解释。
另一答案
你可以这样做:
> +(Math.floor(y/x)*x).toFixed(15);
1.2
另一答案
处理这个任务,我首先找到x
中的小数位数,然后相应地舍入y
。我用的是:
y.toFixed(x.toString().split(".")[1].length);
它应该将x
转换为字符串,将其分割为小数点,找到右边部分的长度,然后y.toFixed(length)
应根据该长度舍入y
。
另一答案
看看这个链接....它帮助了我很多
http://www.w3schools.com/jsref/jsref_toprecision.asp
toPrecision(no_of_digits_required)函数返回一个字符串,所以不要伪造使用parseFloat()函数转换为req精度的小数点
以上是关于在Javascript中处理浮点精度[重复]的主要内容,如果未能解决你的问题,请参考以下文章