2014-12-25 8 views
5

Почему parseInt(1/10000000) Результаты 1, when parseInt(1/1000000) результат: 0?Функция parseInt (1/10000000) возвращает 1. Почему?

Мне нужен какой-то аналог для заливки Java, как int i = -1/10000000;, который является 0.

Должен ли я использовать Math.floor для положительных и Math.ceil для отрицательных? Или есть другое решение?

+0

Как насчет параметра raddix? Он дает тот же результат? –

+1

, потому что 1/10000000 возвращает 1e-7, а 1/1000000 возвращает 0.000001. он отличается тем, как parseInt на самом деле работает ... – FrEaKmAn

+1

@TimVermaelen такой же результат. –

ответ

10

Сначала вопрос кажется интересным. Затем я посмотрел, что такое 1/10000000.

< 1/10000000 
> 1e-7 

Поэтому:

< parseInt("1e-7"); // note `parseInt` takes a STRING argument 
> 1 

Если вы хотите укоротить до целого, вы можете сделать это:

function truncateToInteger(real) { 
    return real - (real % 1); 
} 
+5

Да, и более интересно 'parseInt (1/1000001)' равно 9. :) – PSL

+1

Бит комментария «inb4» здесь, но в то время как 'return real >> 0;' будет работать Кроме того, он ограничен 32-битными номерами, тогда как «return real» (реальный% 1); 'поддерживает любой float. –

+0

А также интересно то, что первое, что делает 'parseInt', это вызов' toString' по первому аргументу ([spec] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.1 .2.2)), а 'parseFloat',' toFixed' и 'toPrecision' - нет. – adeneo

6

ParseInt рассчитывает разобрать строку в качестве аргумента, так преобразует его в сначала.

1/1000000 при преобразовании в строку "0.000001", parseInt затем игнорирует все, начиная с "." так как он предназначен только для целых чисел, поэтому он читает его как 0.

1/10000000 настолько мал, что преобразование его в строку использует экспоненциальное "1e-7", ParseInt затем игнорирует все, от «е» и так далее, так как это только для целых чисел, так что он читает его как 1.

В принципе, parseInt просто не то, что вы должны делать.

Чтобы преобразовать число в целое число, или его с 0, так как любая операция поразрядного в JavaScript заставляет число в 32-битном междунар и ORing с 0 не изменяет значение сверх того, что:

>(-1/10000000)|0 
0 

>1234.56|0 // truncation 
1234 

>(2147483647+1)|0 // integer overflow 
-2147483648 
+0

great @baonn я узнал что-то новое сегодня –

+1

AFAIK, x | 0 также является подсказкой типа для целых чисел в asm.js. Просто забавный факт. –

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