2015-01-21 4 views
2

У меня возникает следующая проблема с расчетами процентов и округлением результатов.Проблема округления в Javascript

Если я использую Math.ceil:

var total = 66666; 
var test1 = Math.ceil(60/100 * total); 
var test2 = Math.ceil(23.5/100 * total); 
var test3 = Math.ceil(14/100 * total); 
var test4 = Math.ceil(2.5/100 * total); 

Тогда test1 + test2 + test3 + test4 = 66664

Если я использую ParseInt:

var total = 66666; 
var test1 = parseInt(60/100 * total); 
var test2 = parseInt(23.5/100 * total); 
var test3 = parseInt(14/100 * total); 
var test4 = parseInt(2.5/100 * total); 

Тогда test1 + test2 + test3 + test4 = 66668

Я пытаюсь переписать мой скрипт Python в Javascript и я n Python У меня не было таких проблем.

+0

Это противоположность: 'Math.ceil' округление вверх, так что вы получите' 66668'. 'parseInt' преобразует в строку и снова анализирует деталь перед точкой до числа, так что, например,' Math.trunc' (но медленнее) вы получаете '66664'. – Oriol

+0

Я не понимаю вопроса. Если вы округлите свои номера, у них будет некоторая ошибка. Когда вы суммируете эти числа, ошибки могут отменять друг друга или складываться. Если вам это не нравится, не раунд. – Oriol

+0

Действительно. Вы сравниваете яблоки и апельсины - 'parseInt' vs' Math.floor' будет лучшим сравнением. Вот [разница в производительности] (http://jsperf.com/math-floor-vs-math-round-vs-parseint/55) –

ответ

7

Если вы читали doc как parseInt работает отпускании, где проблема:

ParseInt() функция анализирует строку в качестве аргумента и возвращает целое число от указанной системы счисления (основание в математической цифрой системы).

Синтаксис

parseInt(string, radix); 

Строка

Значение для синтаксического анализа. Если строка не является строкой, то она преобразуется в один. Ведущие пробелы в строке игнорируются.

Radix

Целое число от 2 до 36, что представляет собой основание (базу в математической системы счисления) в указанной выше последовательности. Укажите 10 для системы с десятичной цифрой, обычно используемой людьми. Всегда задайте этот параметр, чтобы устранить путаницу считывателя и гарантировать предсказуемое поведение . Различные реализации приводят к различным результатам , когда редикс не указан.

Описание

Функция ParseInt преобразует свой первый аргумент в строку, разбирает его, и возвращает целое число или NaN.

Пример:

parseInt(2.1) // returns 2 
parseInt(2.9) // returns 2 too 
parseInt('2.99') // returns 2 

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

Число раундов в javascript лучше всего использовать Math.round() функция.

Ссылка:

Math.Round()

0

Функция Javascript parseInt() принимает в качестве аргумента строку, тогда как Math.ceil() принимает число. Из-за этого, parseInt линии будет интерпретировать строку, которая выглядит примерно так:

parseInt(60/100 * total); 
// equivalent to: parseInt("39999.6") 

При этом, они будут сдирать десятичной и вернуть 39999 где Math.ceil вызовы будут возвращать 40000. Это и объясняет разницу.

Смежные вопросы