Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.12.2011, 17:05
Новичок на форуме
Отправить личное сообщение для divined Посмотреть профиль Найти все сообщения от divined
 
Регистрация: 16.12.2011
Сообщений: 5

alert(12000*1.34); = 16080.000000000002
Собственно сабж в теме.
Или у меня не лады с математикой, или все калькуляторы врут, или что за фигня?
Ответить с цитированием
  #2 (permalink)  
Старый 16.12.2011, 17:06
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 10.12.2011
Сообщений: 290

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

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

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)))

Последний раз редактировалось Livanderiaamarum, 16.12.2011 в 17:14.
Ответить с цитированием
  #3 (permalink)  
Старый 16.12.2011, 17:17
Новичок на форуме
Отправить личное сообщение для divined Посмотреть профиль Найти все сообщения от divined
 
Регистрация: 16.12.2011
Сообщений: 5

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

Так что за проблема у JS с умножением? Я теперь никаким его вычислениям не верю.
Ответить с цитированием
  #4 (permalink)  
Старый 16.12.2011, 17:26
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 10.12.2011
Сообщений: 290

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

Так что за проблема у JS с умножением? Я теперь никаким его вычислениям не верю.
числа в компьютерных системах хранятся в разных форматах. форматы поддерживающие дробные числа имеют определенный уровень точности (так как не хватило бы всех атомов во вселенной чтобы хранить идеальную дробь в памяти компьютера"
по этому при вычислениях с дробными числами всегда есть погрешность.)
Ответить с цитированием
  #5 (permalink)  
Старый 16.12.2011, 17:26
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

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

Сообщение от divined
Так что за проблема у JS с умножением?
IEEE 754 стандарт
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 16.12.2011 в 17:29.
Ответить с цитированием
  #6 (permalink)  
Старый 16.12.2011, 17:31
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 10.12.2011
Сообщений: 290

Сообщение от nerv_ Посмотреть сообщение
var x = (12000 * 1.34).toFixed(4) - 0;
alert(typeof x);
alert(x);
думаешь если человек не знает про форматы хранения данных ему будет понятна (12000 * 1.34).toFixed(4) - 0 ? ))) имхо не будет)
Ответить с цитированием
  #7 (permalink)  
Старый 16.12.2011, 17:31
Новичок на форуме
Отправить личное сообщение для divined Посмотреть профиль Найти все сообщения от divined
 
Регистрация: 16.12.2011
Сообщений: 5

Я с этим со всем согласен, и знаю эти стандарты.
Однако все языки программирования используют этот стандарт, и я впервые встречаю такое поведение. Другие языки так себя не ведут.
Ответить с цитированием
  #8 (permalink)  
Старый 16.12.2011, 17:33
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от divined
Другие языки так себя не ведут.
Ведут Аппроксимация
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 16.12.2011 в 17:46.
Ответить с цитированием
  #9 (permalink)  
Старый 16.12.2011, 17:35
Новичок на форуме
Отправить личное сообщение для divined Посмотреть профиль Найти все сообщения от divined
 
Регистрация: 16.12.2011
Сообщений: 5

хмм,
<?php echo(12000*1.34); ?>
16080
Ответить с цитированием
  #10 (permalink)  
Старый 16.12.2011, 17:36
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 10.12.2011
Сообщений: 290

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

Последний раз редактировалось Livanderiaamarum, 16.12.2011 в 17:39.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск