Работа с точностью float в Javascript [дубликат]
этот вопрос уже есть ответ здесь:
у меня есть большое количество числовых значений y в javascript. Я хочу сгруппировать их, округляя их до ближайшего кратного 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
5 ответов:
из этого поста: Как справиться с точностью чисел с плавающей запятой в JavaScript?
у вас есть несколько вариантов:
- используйте специальный тип данных для десятичных знаков, например десятичное число.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Вы можете проверить полное объяснение здесь.
решая эту задачу, я бы сначала нашел количество десятичных знаков в
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
Comments