Правильно ли следующее? И почему?
x = 7;
y = 7.00;
z = x + y;
console.log(z);
Результат:
14
Я ожидаю, что результат журнала будет "14.00".
Правильно ли следующее? И почему?
x = 7;
y = 7.00;
z = x + y;
console.log(z);
Результат:
14
Я ожидаю, что результат журнала будет "14.00".
Утверждение верно на 99%: в JavaScript нет «динамической типизации int/float», потому что в JavaScript нет целых чисел или чисел с плавающей запятой. console.log
запишет наиболее компактное представление. На самом деле console.log(7.00)
отображает 7
.
Более правильное утверждение: целые числа внутренне доступны в JavaScript (в основном в результате битовых операций), но все числа, которые достигают вашей программы, являются числами с плавающей запятой.
Наконец, нет причин, по которым console.log
должно отображать что-либо с точностью до двух знаков после запятой, если только самое компактное представление не имеет двух знаков после запятой (например, 7.23
).
z.toFixed(2)
для целей отображения. - person Curt   schedule 13.07.2015100
при отображении (когда, да, вы бы отображали их так же, как вы показываете); поскольку десятичные значения неточны. Даже если целочисленные значения хранятся как числа с плавающей запятой, они точны до9007199254740991
, в отличие от десятичных чисел, которые не могут быть точными из-за того, как функционируют числа с плавающей запятой. - person Amadan   schedule 13.07.20157.23
, вместо этого сохраните723
и помните, что это две цифры; то есть делать все в центах. Почему? Поскольку часть7.23
не может быть правильно представлена в IEEE754, а часть723
может. Когда вам нужно отобразить, деление на100
будет достаточно близко, чтобы отображение было правильным. Но если вы выполняете вычисления на7.23
, вы в конечном итоге столкнетесь с ошибкой0.1 + 0.2 == 0.30000000000000004
(чем больше вы делаете, тем хуже). - person Amadan   schedule 13.07.2015