Подтвердить что ты не робот

JavaScript с добавлением десятичных чисел

Итак, я создаю script, который добавляет два числа (десятичные числа) вместе, с которыми я столкнулся с проблемой.

http://jsfiddle.net/DerekL/esqnC/

Я сделал script, получилось неплохо:

0.1 + 0.5  //0.6
0.2 + 0.3  //0.5

Но скоро я вижу:

0.1 + 0.2  //0.30000000000000004
0.01 + 0.06  //0.06999999999999999

И это не выглядит правильным для меня. Я знаю, что это недостаток использования точки плавания с конечными битами, но я не могу найти способ исправить это.

Math.ceil   //No
Math.floor  //No
.slice      //No

UPDATE

Можно ли сначала умножить числа на 1000, затем добавить их, а затем разделить на 1000?

4b9b3361

Ответ 1

Используйте toFixed, чтобы преобразовать его в строку с некоторыми разделительными знаками после запятой, а затем преобразовать ее обратно в число.

+(0.1 + 0.2).toFixed(12) // 0.3

Похоже, что IE toFixed имеет какое-то странное поведение, поэтому, если вам нужно поддерживать IE, что-то вроде этого может быть лучше:

Math.round((0.1 + 0.2) * 1e12) / 1e12

Ответ 2

function add(){
    var first=parseFloat($("#first").val());
    var second=parseFloat($("#second").val());
    $("#result").val(+(first+second).toFixed(2));
}

DEMO.

Ответ 3

Тестирование этого Javascript:

var arr = [1234563995.721, 12345691212.718, 1234568421.5891, 12345677093.49284];

var sum = 0;
for( var i = 0; i < arr.length; i++ ) {
    sum += arr[i];
}

alert( "fMath(sum) = " + Math.round( sum * 1e12 ) / 1e12 );
alert( "fFixed(sum) = " + sum.toFixed( 5 ) );

Заключение

Не используйте Math.round( (## + ## + ... + ##) * 1e12) / 1e12

Вместо этого используйте ( ## + ## + ... + ##).toFixed(5) )

В IE 9 toFixed работает очень хорошо.

Ответ 4

Это обычная проблема с плавающими точками.

Используйте toFixed в сочетании с parseFloat.

Вот пример в JavaScript.