Имеет ли смысл после каждой математической операции производить округление для борьбы с неточными вычислениями?
Или не надо изобретать велосипед? А надо просто исходить из критичности неточных вычислений для работы программы, и там где это критично - использовать тип данных Decimal (в JS, видимо, реализуемый какой-нибудь сторонней библиотекой).
'use strict';
// Просто примеры.
var a = (0.1 + 0.2) * 10;
var b = (0.1 + 0.7) * 10;
// Без округления.
console.log(a);
console.log(b);
console.log(Math.ceil(a));
console.log(Math.floor(b));
// С округлением (хотя надо было уже после сложения округлять).
console.log(Math.round(a * 100) / 100);
console.log(Math.round(b * 100) / 100);
console.log(Math.ceil(Math.round(a * 100) / 100));
console.log(Math.floor(Math.round(b * 100) / 100));
'use strict';
function r(a) {
return Math.round(a * 100) / 100;
}
console.log((r(5 / 2 * 10)).toFixed(100));
console.log((r(r(5 / 2) * 10)).toFixed(100));
Ответы (2 шт):
Автор решения: openman2077 error
→ Ссылка
в зависимости от задачи и важности
например в java банковский софт для подсчёта денег
используется int - т.е. целочисленный тип, т.к. погрешности с такими вещами,
как деньги - неприемлемы :)
Автор решения: hwak
→ Ссылка
Округляя промежуточные результаты вычисления вы уменьшаете точность итогового результата. Для борьбы с неточными вычислениями обычно прибегают к повышению точности, например, увеличением количества знаков после запятой. При округлении результата нужно убедится в том, что стратегий округления одинаковы во всех местах.