Динамическая типизация JavaScript int/float

Правильно ли следующее? И почему?

x = 7;
y = 7.00;
z = x + y;
console.log(z);

Результат:

14

Я ожидаю, что результат журнала будет "14.00".


person Scotty    schedule 13.07.2015    source источник
comment
уже ответил действительно, так что посмотрите здесь. stackoverflow.com/ вопросы/3612744/   -  person EasyBB    schedule 13.07.2015
comment
Javascript на самом деле не имеет типа int: все числа являются числами с плавающей запятой. Для валюты вы можете использовать что-то вроде z.toFixed(2) для целей отображения.   -  person Curt    schedule 13.07.2015
comment
@Curt: На самом деле, для валюты было бы лучше всего выполнять все расчеты в целых значениях, а затем делить на 100 при отображении (когда, да, вы бы отображали их так же, как вы показываете); поскольку десятичные значения неточны. Даже если целочисленные значения хранятся как числа с плавающей запятой, они точны до 9007199254740991, в отличие от десятичных чисел, которые не могут быть точными из-за того, как функционируют числа с плавающей запятой.   -  person Amadan    schedule 13.07.2015
comment
Это не ответ на вопрос, EasyBB.   -  person Scotty    schedule 13.07.2015
comment
@ Амадан. Я не уверен, что вы поняли, что я сказал. В Javascript нет целочисленного типа: есть только числовой тип с плавающей запятой. Я не предлагаю Скотти использовать поплавки — у него нет выбора.   -  person Curt    schedule 13.07.2015
comment
@Curt: Нет, видимо, ты не понимаешь, о чем я говорю. Я только что сказал, что в моем посте нет целочисленного type; но, безусловно, есть целочисленные значения. Если вы хотите сохранить 7.23, вместо этого сохраните 723 и помните, что это две цифры; то есть делать все в центах. Почему? Поскольку часть 7.23 не может быть правильно представлена ​​в IEEE754, а часть 723 может. Когда вам нужно отобразить, деление на 100 будет достаточно близко, чтобы отображение было правильным. Но если вы выполняете вычисления на 7.23, вы в конечном итоге столкнетесь с ошибкой 0.1 + 0.2 == 0.30000000000000004 (чем больше вы делаете, тем хуже).   -  person Amadan    schedule 13.07.2015


Ответы (1)


Утверждение верно на 99%: в JavaScript нет «динамической типизации int/float», потому что в JavaScript нет целых чисел или чисел с плавающей запятой. console.log запишет наиболее компактное представление. На самом деле console.log(7.00) отображает 7.

Более правильное утверждение: целые числа внутренне доступны в JavaScript (в основном в результате битовых операций), но все числа, которые достигают вашей программы, являются числами с плавающей запятой.

Наконец, нет причин, по которым console.log должно отображать что-либо с точностью до двух знаков после запятой, если только самое компактное представление не имеет двух знаков после запятой (например, 7.23).

person Amadan    schedule 13.07.2015
comment
Если вместо вызова console.log() я делаю это в своей консоли Chrome: - person Scotty; 13.07.2015