2017-02-17 21 views
1

Я вычисляю стандартное отклонение для графика, и хотя я получаю правильные значения для квадрата каждой точки на графике, мне трудно получить сумму квадратов. Я должен получить 17.20, но вместо этого получаю 14. Кажется, это только добавление первого числа, а не десятичных знаков. Вот мой код:Проблема с правильной суммой

var1 = (var1 * var1).toFixed(2); //alert(var1); getting 2.56 
var2 = (var2 * var2).toFixed(2); //alert(var2); getting 1.96 
var3 = (var3 * var3).toFixed(2); //alert(var3); getting 5.76 
var4 = (var4 * var4).toFixed(2); //alert(var4); getting 6.76 
var5 = (var5 * var5).toFixed(2); //alert(var5); getting 0.16 

var sum = ( parseInt(var1)+parseInt(var2)+parseInt(var3)+parseInt(var4)+parseInt(var5)).toFixed(2); 

alert(sum); // should get 17.20, but getting 14 
+1

Почему вы меняете вещи с помощью. toFixed (2) 'до строкового float, а затем проанализировать его обратно в int, потеряв плавающую часть? Вы пробовали parseFloat()? – Shilly

+1

Как вы думаете, что означает «Int» часть 'parseInt'? –

+1

вы получаете '2 + 1 + 5 + 6 = 14' использовать' parseFloat() 'вместо – JohnnyAW

ответ

1

Там нет причин для вас использовать parseInt здесь, если только вы не хотите, чтобы суммировать целые части квадратов.

parseInt «анализирует строку и возвращает целое число». Если вы измените вызовы parseInt на каждый квадрат до parseFloat, он будет правильно анализировать значения с плавающей запятой из ваших строк и правильно суммировать их.

+1

измените его на parseFloat, так как он сменил умноженные поплавки на строку с toFixed (2) – Shilly

+0

Право, я пропустил эту часть в первый раз, когда прочитал ее. Я собирался отредактировать свой ответ, когда SO ушел на техническое обслуживание. –

0

Вы получаете целую сумму, а не десятичные числа, потому что вы parseInt строк. Просто используйте parseFloat, и он будет работать.

1

Вы не должны использовать parseInt, так как он преобразует флоат-значения в Целые, что означает, что каждый продукт раздавливания:

2 + 1 + 5 + 6 + 0 = 14

Для достижения нужного результата вы могли бы также написать:

var1 = Math.pow(var1, 2); 
var2 = Math.pow(var2, 2); 
var3 = Math.pow(var3, 2); 
var4 = Math.pow(var4, 2); 
var5 = Math.pow(var5, 2); 

var sum = var1 + var2 + var3 + var4 + var5; 

alert(sum.toFixed(2)); 

Или написать меньше строк:

var fixedSum = [var1, var2, var3, var4, var5].reduce(function(acc, curr){ 
    return acc + Math.pow(curr, 2) 
}, 0).toFixed(2); 
0

Это происходит потому, что вы разборе каждой переменной до целого, отсекая знаков после запятой

Целые целые числа так, ваша реальная работа заключается в следующем:

var1 2.56->2 + var2:1.96->1 ... 
parseInt(var1)+parseInt(var2)+parseInt(var3)+parseInt(var4)+parseInt(var5)).toFixed(2); 

вы хотите удалить ParseInt и просто сложить их вместе, как например:

sum = (var1 + var2 + var3 + var4 +var5).toFixed(2); 

Я также хотел бы предложить вам тур (используйте toFixed) только один раз, а постоянно округление снижает точность и Javascript, это число в строки, которые могли бы привести к неожиданным результатам.