Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   alert(12000*1.34); = 16080.000000000002 (https://javascript.ru/forum/misc/24055-alert-12000%2A1-34-%3B-%3D-16080-000000000002-a.html)

divined 16.12.2011 17:05

alert(12000*1.34); = 16080.000000000002
 
Собственно сабж в теме.
Или у меня не лады с математикой, или все калькуляторы врут, или что за фигня?

Livanderiaamarum 16.12.2011 17:06

Цитата:

Сообщение от divined (Сообщение 143483)
Собственно сабж в теме.
Или у меня не лады с математикой, или все калькуляторы врут, или что за фигня?

калькуляторы врут

используйте фиксы

alert (0.3 - 0.2)
alert( (0.3 - 0.2).toFixed(1)  )


метод .toFixed() применяется к числу, и округляет его до нужно знака после запятой.
принимает в себя число, количество знаков до которых округлять. правда возвращает он строку. так что потом
придется еще и превращать это все в число.




alert(typeof (0.3 - 0.2).toFixed(1))
alert(typeof parseFloat((0.3 - 0.2).toFixed(1)))
alert(parseFloat((0.3 - 0.2).toFixed(1)))

divined 16.12.2011 17:17

Благодарю, я как раз таки это число потом превращал в строку, теперь просто этой функцией и превращаю в строку =)

Так что за проблема у JS с умножением? Я теперь никаким его вычислениям не верю.

Livanderiaamarum 16.12.2011 17:26

Цитата:

Сообщение от divined (Сообщение 143487)
Благодарю, я как раз таки это число потом превращал в строку, теперь просто этой функцией и превращаю в строку =)

Так что за проблема у JS с умножением? Я теперь никаким его вычислениям не верю.

числа в компьютерных системах хранятся в разных форматах. форматы поддерживающие дробные числа имеют определенный уровень точности (так как не хватило бы всех атомов во вселенной чтобы хранить идеальную дробь в памяти компьютера"
по этому при вычислениях с дробными числами всегда есть погрешность.)

nerv_ 16.12.2011 17:26

var x = (12000 * 1.34).toFixed(4) - 0;
alert(typeof x);
alert(x);

Цитата:

Сообщение от divined
Так что за проблема у JS с умножением?

IEEE 754 стандарт

Livanderiaamarum 16.12.2011 17:31

Цитата:

Сообщение от nerv_ (Сообщение 143490)
var x = (12000 * 1.34).toFixed(4) - 0;
alert(typeof x);
alert(x);

думаешь если человек не знает про форматы хранения данных ему будет понятна (12000 * 1.34).toFixed(4) - 0 ? ))) имхо не будет)

divined 16.12.2011 17:31

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

nerv_ 16.12.2011 17:33

Цитата:

Сообщение от divined
Другие языки так себя не ведут.

Ведут :) Аппроксимация

divined 16.12.2011 17:35

хмм,
<?php echo(12000*1.34); ?>
16080

Livanderiaamarum 16.12.2011 17:36

Цитата:

Сообщение от divined (Сообщение 143492)
Другие языки так себя не ведут.

1) ведут
2) есть способ обходить эту неточность, вычислениями в столбик)) иными словами в памяти хранится не ДРОБНОЕ ЧИСЛО, а хранится что на что делить. и потом когда тебе нужно получить значение, ты просто указываешь точность и комп вычисляет столбиком)))
3) во многих языках стоит автофикс если тип числа и система счисления не указаны явно)) по этому ты и не замечаешь такого поведения)


Часовой пояс GMT +3, время: 22:46.